【问题标题】: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;

}

}

【问题讨论】:

    标签: java android android-edittext maskedtextbox


    【解决方案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) 时它起作用了。我在上面发布了有效的答案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-12
        • 1970-01-01
        • 1970-01-01
        • 2020-01-31
        • 2011-12-23
        • 2016-04-20
        相关资源
        最近更新 更多