安卓自定义 TextView 显示货币金额

3
我需要为TextView设置一个掩码,以将其文本转换为特定的样式(货币格式,我的格式如下:Rls ###,###,###,###),但后续需要获取其原始文本。我该怎么办?
======================================================
假设我将这个字符串传递给TextView:2120000 用户应该看到的是:Rls 2,120,000 但是.getText方法应该返回:2120000 ======================================================
格式化代码应该像这样:
DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setDecimalSeparator(',');
DecimalFormat decimalFormat = new DecimalFormat("Rls ###,###,###,###", symbols);
String prezzo = decimalFormat.format(Integer.parseInt(textTemp));

任何帮助都将不胜感激。
5个回答

3
正确的方法应该是这样的: 创建一个自定义的TextView作为Java类。
public class RialTextView extends TextView {

    String rawText;

    public RialTextView(Context context) {
        super(context);

    }

    public RialTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public RialTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        rawText = text.toString();
        String prezzo = text.toString();
        try {

            DecimalFormatSymbols symbols = new DecimalFormatSymbols();
            symbols.setDecimalSeparator(',');
            DecimalFormat decimalFormat = new DecimalFormat("###,###,###,###", symbols);
            prezzo = decimalFormat.format(Integer.parseInt(text.toString()));
        }catch (Exception e){}

        super.setText(prezzo, type);
    }

    @Override
    public CharSequence getText() {

        return rawText;
    }
}

在XML中,可以使用以下方式代替<TextView标签:

<com...RialTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Price"
        android:id="@+id/tv_itemgriditems_Price"
        android:layout_below="@+id/tv_itemgriditems_Remain"
        android:layout_centerHorizontal="true"
        android:textSize="15sp"
        />

检查一下我的回答,我在你的回答之前已经分享了相同的想法15分钟。 - Lajos Arpad

0

每次输入字符时,您都必须修改您的EditText。请尝试此代码片段

EditText currencyEditText= (EditText)findViewById(R.id.medittext);
searchTo.addTextChangedListener(new TextWatcher() {

    @Override
    public void afterTextChanged(Editable s) {
        // TODO Auto-generated method stub

    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

        DecimalFormatSymbols symbols = new DecimalFormatSymbols();
        symbols.setDecimalSeparator(',');
        DecimalFormat decimalFormat = new DecimalFormat("Rls ###,###,###,###", symbols);
        String prezzo = decimalFormat.format(Integer.parseInt(s));
        currencyEditText.setText(prezzo);
    } 

});

这样可以向用户显示数字,但当我想从.getText()方法中获取原始数字时,这并没有帮助我,因为它返回“Rls 2,100,000”... 我需要它返回“2100000”。 - Muhammad Naderi
当您想获取原始数字时,只需解析该数据。用空字符串替换逗号,就这样。 - BeingMIAkashs
你必须使用自己修改过的方法,没有任何内置的Android库可用于此。 - BeingMIAkashs

0
假设你有一个类 MyParser:
public class MyParser {

    //...
    public static String getRawValue(value) {
        //Converts value to raw value, for instance, converts Rls 2,120,000 to 2120000
    }

    public static String getViewValue(value) {
        //Converts value to view value, for instance, converts 2120000 to Rls 2,120,000
    }
    //...
}

现在,让我们再来一个类,叫做MyTextView:
public class MyTextView extends TextView {

    public CharSequence getText () {
        return MyParser.getRawValue(super.getText());
    }

    public void setText (CharSequence text, TextView.BufferType type) {
        super.setText(MyParser.getViewValue(text), type)
    }

}

这个想法是正确的,但完整的答案是我已经发布的, 还是谢谢。 - Muhammad Naderi
我不喜欢你的setText。setText应该只处理设置文本的事情。你应该在内部调用一个方法来解决你的字符串内容。想象一下,如果你想重用相同的解析算法,你将会复制和粘贴代码到其他地方。你应该有可重用的解决方案,所以你应该像我的答案中建议的MyParser那样做。 - Lajos Arpad

0

您可以使用相同的DecimalFormat对象来解析格式化字符串:

DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setDecimalSeparator(',');
DecimalFormat decimalFormat = new DecimalFormat("Rls ###,###,###,###", symbols);

try {
    // get int value
    int i = decimalFormat.parse(textView.getText().toString()).intValue();
} catch (ParseException e) {
    // handle error here
}

0

将长整型转换为里亚尔格式

    public String FormatCost(long cost){
    try {
        DecimalFormatSymbols symbols = new DecimalFormatSymbols();
        symbols.setDecimalSeparator(',');
        DecimalFormat decimalFormat = new DecimalFormat("###,###,###,###", symbols);
        return decimalFormat.format(Integer.parseInt(cost+""));
    }catch (Exception e) {
        return cost + "";
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接