如何在 TextView 中显示格式化的金额?
How to display formatted amounts in TextView?
我在 String
中有一个货币符号,在 double
中有一个金额。到目前为止,我显示的金额是这样的:
amount.setText(currency + " " + amount);
在某些地方,我有 2 TextView
s 来显示数量,中间有填充:
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
我在 String
中有一个货币符号,在 double
中有一个金额。到目前为止,我显示的金额是这样的:
amount.setText(currency + " " + amount);
在某些地方,我有 2 TextView
s 来显示数量,中间有填充:
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