如何在 TextView 中显示格式化的金额?

How to display formatted amounts in TextView?

我在 String 中有一个货币符号,在 double 中有一个金额。到目前为止,我显示的金额是这样的:

amount.setText(currency + " " + amount);

在某些地方,我有 2 TextViews 来显示数量,中间有填充:

currency.setText(currency);
amount.setText(amount);

很好。但是,我正在将此代码移动到具有 android 数据绑定的布局文件中,是否有一种简单的方法来格式化和显示 android 中的数量?

symbol[space]amount 相似,其中金额的格式应保留 2 个小数点(如果存在),否则为整数。例如,100 将显示为 100,而不是 100.00,但 123.2 将首先显示为 123.20 以及货币符号 ($123.20, $100)。

我知道有几种方法(资源字符串格式,NumberFormat)我可以做到(我还没有使用过它们中的任何一种,只是听说过),但是最简单和最干净的方法是什么?

我正在尝试查找所有 2 个文本视图并将其转换为单个文本视图,并寻找统一的方式来格式化和显示数量。

谢谢。

如果您使用此 amount.setText(currency + " " + amount); 而不是每次使用 text.getText() 时,您必须将 $ 和 space 从 textView 中分离出来以获得实际金额。

但是

在2 textView中你不需要对getText()方法进行任何操作你直接得到amount。

将此用于 2 个十进制数字和 0 个十进制数字...

 double price=23.1000;
 int number=(int)((price*100)%100);
 yourTextView.setText(number==0?new DecimalFormat("0").format(price):new DecimalFormat("0.00").format(price));

outPut:-

23.1000 -------> 23.10

23.0007 -------> 23

以上代码有效.....

注意:- 在上面的 2 个中,我建议使用 2 个 textView。就是这么简单。

我认为您需要查看一些库,您会在这里找到一些很好的示例,我向您推荐了货币文本数据绑定的最佳库之一,我使用它对我非常有帮助,它在此处保存我的代码行是MoneyTextView

<org.fabiomsr.moneytextview.MoneyTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="32dp"
    app:symbol="$"
    app:symbolGravity="start|top"
    app:symbolTextSize="30sp"
    app:symbolMargin="6dp"
    app:amount="1256.56"
    app:baseTextSize="54sp"
    app:decimalDigitsTextSize="30sp"
    app:decimalMargin="6dp"
    app:includeDecimalSeparator="false"
    app:baseTextColor="#FBFFE3"/>
amount.setText(currency + String.format("%.2f", amount));

如果您正在寻找一些简单易行的方法来格式化字符串并将其设置为 TextView。

流行的方法,遵循这个Android, Is it possible to format textview like System.out.format("%02d", n);?

如果您要使用 DataBinding,您需要设置自己的绑定方法,因为原始 android:text 属性是 Integer(String resource)字符串(文本)

在Android官方,你可以使用类似的东西 (https://developer.android.com/topic/libraries/data-binding/index.html#expression_language)

android:text="@{@string/nameFormat(firstName, lastName)}"
android:text="@{@plurals/banana(bananaCount)}"

但是如果你想要更灵活的方式,你需要编写自己的绑定方法,如下所示。

在你的代码中,

 @BindingAdapter(value = {"android:text", "android:formatArgs"}, requireAll = false)
    public static void bindTextStr(TextView tv, String text, Object[] formatstr) {
        if (formatstr == null) {
            tv.setText(text);
        } else {
            tv.setText(String.format(text, formatstr));
        }
    }

在您的布局中 xml,

<variable
            name="normalStr"
            type="java.lang.String"/>
        <variable name="data" type="Object[]"/>
...
<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{normalStr}"
        android:formatArgs="@{data}"
        />

在Activity代码中,

    mBinding = DataBindingUtil.inflate(LayoutInflater.from(this), R.layout.activity_main, null, false);
    mBinding.setNormalStr("Data : 1(%s), 2(%d)");
    mBinding.setData(new Object[]{"Hello World",12345});

受@Nowshad 回答的启发,我可以在没有外部库和数据绑定库的情况下做到这一点。

需要时在布局文件中提供货币和金额:

          <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="end"
                android:textAppearance="@style/TextAppearance.AppCompat.Large"
                app:amount="@{amount}"
                app:currency="@{currency}" />

并提供绑定适配器:

@BindingAdapter({"currency", "amount"})
    public static void setCurrencyAndAmount(TextView textView, String currency, double amount) {
        SpannableString spannableString = new SpannableString(currency + " " +
                new DecimalFormat("#.##").format(amount));

        spannableString.setSpan(new RelativeSizeSpan(0.6f), 0, 1, 0);

        textView.setText(spannableString);
    }

简单高效。

也许有用:MultiSizeTextView

<com.github.captain_miao.multisizetextview.MultiSizeTextView
    android:id="@+id/multi_text_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"

    app:beforeText="@string/before_text"
    app:beforeTextColor="@color/red"
    app:beforeTextSize="@dimen/text_size_small"
    app:beforeTextStyle="bold"

    app:centerText="@string/app_name"
    app:centerTextColor="@color/gray"
    app:centerTextSize="@dimen/text_size_big"

    app:afterText="@string/after_text"
    app:afterTextColor="@color/blue"
    app:afterTextSize="@dimen/text_size_small"
    app:afterTextStyle="bold"
    />

这样做

int enduser=35000000;
TextView lblEnduser=(TextView)v.findViewById(R.id.lblEnduser);
lblEnduser.setText(String.format("%,.0f", Float.valueOf(enduser) ));

产量:35,000,000