如何使用小数点后三位的货币掩码?

Posted

技术标签:

【中文标题】如何使用小数点后三位的货币掩码?【英文标题】:How to use a currency mask with three decimal places? 【发布时间】:2013-11-21 12:55:39 【问题描述】:

我正在使用一个类将我的 EditText 的值格式化为货币。这个类使用函数 NumberFormat.getCurrencyInstance().format((parsed/100));格式化。这门课让我的价值有两个小数位(R$2,00)。我希望它有三位小数(2,000 雷亚尔)。它的气体价值。在巴西,我们使用三位小数来表示气体。

这是我正在使用的课程:

public class MascaraMonetaria implements TextWatcher

final EditText mEditText;
String current;
static Context context;
public MascaraMonetaria(EditText mEditText, String current, Context context) 
    super();
    this.mEditText = mEditText;
    this.current = current;     


@Override
public void afterTextChanged(Editable arg0) 

@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) 

@Override
public void onTextChanged(CharSequence s, int arg1, int arg2, int arg3) 
    if (!s.toString().equals(current)) 
        mEditText.removeTextChangedListener(this);

        String cleanString = s.toString().replaceAll("[R$,.]", "");

        double parsed = Double.parseDouble(cleanString);
        String formatted = NumberFormat.getCurrencyInstance().format((parsed/100));

        current = formatted;

        mEditText.setText(formatted);
        mEditText.setSelection(formatted.length());
        mEditText.addTextChangedListener(this);
    



public static double stringMonetarioToDouble(String str) 
    double retorno = 0;
    try 
        boolean hasMask = ((str.indexOf("R$") > -1 || str.indexOf("$") > -1) && (str
                .indexOf(".") > -1 || str.indexOf(",") > -1));
        // Verificamos se existe máscara
        if (hasMask) 
            // Retiramos a mascara.
            str = str.replaceAll("[R$]", "").replaceAll("[$]", "").replaceAll("[.]", "").replaceAll("[,]", ".");
            
        // Transformamos o número que está escrito no EditText em double.
        retorno = Double.parseDouble(str);

     catch (NumberFormatException e) 

    
    return retorno;


【问题讨论】:

【参考方案1】:

我做到了我使用这个答案的代码:Correctly formatting currencies to more decimal places than the Locale specifies

这是我的代码:

        formatted.setMinimumFractionDigits(3);
        formatted.setMaximumFractionDigits(3);

        current = formatted.format((parsed/1000));

        mEditText.setText(formatted.format((parsed/1000)));
        mEditText.setSelection(formatted.format((parsed/1000)).length());
        mEditText.addTextChangedListener(this);

【讨论】:

【参考方案2】:

您可以创建一个小数点后三位的十进制格式化程序,并在需要的地方添加一个“$”符号。

您也可以从一个函数中完成所有这些,然后在需要时调用该函数。

   import java.text.DecimalFormat;

   DecimalFormat fmt = new DecimalFormat("0.###");

   public String currencyConverter(int money);
   
       String cash = Integer.toString(money);

      return "$" + fmt.format(cash);


   

或者你可以试试这个。

   DecimalFormat fmt = new DecimalFormat("$0.###");

我不确定它是否会起作用,但是我无法在 ATM 上测试它。

【讨论】:

【参考方案3】:

您可以设置比例来格式化价格值,如下所示

BigDecimal price = new BigDecimal("134.65");
String decString = price.setScale(3).toPlainString();
System.out.println(" Formatted price  ==> "+decString);

输出是

格式化价格 ==> 134.650

还有另一种方式可以使用您的当地货币返回,但我认为巴西当地货币不支持 ;

       String formated= NumberFormat.getCurrencyInstance().format(price);
//String formated= NumberFormat.getCurrencyInstance(Locale.FRANCE).format(price);
       System.out.println(" Formatted price  with local   ==> "+formated);

[更新]: 为了适应,你可以用你的解析代码替换下面的一行代码

  String formatted=new BigDecimal(cleanString).setScale(3).toPlainString();

【讨论】:

我如何在课堂上调整这一点? 第一个解决方案还是第二个解决方案? 好的;您应该使用 cleanString 而不是 s -更新了答案 什么是'不起作用' :-) 它是 java 代码,应该以相同的方式在任何地方运行。你得到的错误/输出是什么?你有什么期望? 每次键盘输入一个数字时,它会在edittext中放入很多数字。当我执行 setMinimumFractionDigits(3) 时它起作用了。我在上面发布了有效的答案。

以上是关于如何使用小数点后三位的货币掩码?的主要内容,如果未能解决你的问题,请参考以下文章

long类型截取后几位

matlab里面如何保留小数点后三位

excel如何让批量数据四舍五入保留小数点后三位?

EF5 代码优先迁移:小数精度和小数位数

全站仪测出的坐标小数点后三位单位是啥

小数点后三位