Как отформатировать число с плавающей запятой в Джейсоне, чтобы отображались только два десятичных знака?

Как отформатировать число как валюту с двумя десятичными знаками в Джейсоне?

Код ниже иллюстрирует случай:

products([["Banana",1], ["Apple",2], ["Pinapple",2.5]]).
margin(2).

!printPrices.

+!printPrices: products(List) & margin(Z)<-
 .length(List,LLenght);
 -+listSize(0);
 while(listSize(Sz) & Sz < LLenght)
 {        
  .random(Y);
  .nth(Sz,List,Item);
  .nth(0,Item,Name);
  .nth(1,Item,Price);
  .print("Product(",Sz,"): ",Name," Price $",Y*Z+Price);
  -+listSize(Sz+1);
 }.

Вывод, я хотел бы сделать вывод более читабельным. Обратите внимание, что числа с плавающей запятой имеют много альгаризмов:

[sampleagent] Product(0): Banana Price $1.3689469979841409 
[sampleagent] Product(1): Apple Price $2.0475157980624523
[sampleagent] Product(2): Pinapple Price $3.4849443740416803

person Sharlene Goncalves    schedule 04.09.2017    source источник


Ответы (1)


На самом деле в Джейсоне нет внутреннего действия по умолчанию, чтобы отформатировать его как ты хочешь. Тем не менее, вы можете создать собственное внутреннее действие следующим образом:

import jason.asSemantics.*;
import jason.asSyntax.*;

public class formatCurrency extends DefaultInternalAction {

    private static final long serialVersionUID = 1L;

    @Override
    public Object execute(TransitionSystem ts, Unifier un, Term[] args) throws Exception {

        StringTerm result = new StringTermImpl(String.format("%.2f", Float.valueOf(args[0].toString())));
        un.unifies(result, args[1]); 

        return true;
    }
}

В вашем агенте вы можете вызвать это действие следующим образом:

package_name.formatCurrency(10.5555,Price);
person Cleber Jorge Amaral    schedule 13.12.2017