2013-11-21 58 views
0

我正在使用一個類來將我的EditText的值格式化爲貨幣。這個類使用函數NumberFormat.getCurrencyInstance()。format((parsed/100));格式化。這個班級使我的價值與兩個decimal地方(R $ 2,00)。我希望它有三位小數(R $ 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; 

} 

}

回答

0

你可以只創建一個十進制格式到小數點後三位和Concat的一個「$」符號到需要的地方。

你也可以從一個函數中完成所有這些,然後在需要的地方調用該函數。

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。

+0

謝謝爲答案,但它不起作用。 – Roland

0

可以設置刻度的價格值格式如下所示

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(); 
+0

如何在我的課堂上適應這種情況? – Roland

+0

第一個解決方案還是第二個? –

+0

兩種解決方案。 – Roland

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); 
相關問題