如何在 android 编辑字段中将字符串数字格式化为逗号

对于什么功能,我可以使用在机器人显示不同格式的数字。

例如: 如果我输入1000,那么它应该像这样显示1000。 如果我输入10000,那么它应该像这样显示10000。 如果我输入1000000,那么它应该像这样显示1,000,000。

请指引我。

89053 次浏览

try this one hope it will help.

 System.out.println(NumberFormat.getNumberInstance(Locale.US).format(1000));

You could use DecimalFormat and just format the number

DecimalFormat formatter = new DecimalFormat("#,###,###");
String yourFormattedString = formatter.format(100000);

The result will be

  • 1,000,000 for 1000000
  • 10,000 for 10000
  • 1,000 for 1000

Update 12/02/2019

This String.format("%,d", number) would be a better(less hardcoded) solution as indicated in the comments below by @DreaminginCode so I thought I would add it here as an alternative

Add a text change listener as below (Also make sure that the input type selected for Edittext is Number) :

etTest.addTextChangedListener(new TextWatcher() {


boolean isManualChange = false;


@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
if (isManualChange) {
isManualChange = false;
return;
}


try {
String value = s.toString().replace(",", "");
String reverseValue = new StringBuilder(value).reverse()
.toString();
StringBuilder finalValue = new StringBuilder();
for (int i = 1; i <= reverseValue.length(); i++) {
char val = reverseValue.charAt(i - 1);
finalValue.append(val);
if (i % 3 == 0 && i != reverseValue.length() && i > 0) {
finalValue.append(",");
}
}
isManualChange = true;
etTest.setText(finalValue.reverse());
etTest.setSelection(finalValue.length());
} catch (Exception e) {
// Do nothing since not a number
}
}


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


}


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


}
});
private String getFormatedAmount(int amount){
return NumberFormat.getNumberInstance(Locale.US).format(amount);
}
int[] numbersToFormat = new int[]
{ 1, 10, 100, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 };




for (int number : numbersToFormat) {
System.out.println(
NumberFormat.getNumberInstance(Locale.getDefault()).format(number));
}

OUTPUT

1
10
100
10,000
100,000
1,000,000
10,000,000
100,000,000
1,000,000,000

You can use Numberformat

public static double getNumberByString(String s) throws ParseException {
return NumberFormat.getInstance(Locale.getDefault()).parse(s).doubleValue();
}

Add this function in common class

  public static String getFormatedNumber(String number){
if(!number.isEmpty()) {
double val = Double.parseDouble(number);
return NumberFormat.getNumberInstance(Locale.US).format(val);
}else{
return "0";
}
}

And use that function every where like this:

String newNumber = Utils.getFormatedNumber("10000000");
public static String formatNumber(int number){
return NumberFormat.getNumberInstance(Locale.getDefault()).format(number);
}
public static String formatNumber(String number){
return NumberFormat.getNumberInstance(Locale.getDefault()).format(Integer.parseInt(number));
}

I wrote this Kotlin extension function may can help.

fun String.formatPoint(): String {
val sb = StringBuilder()
this.reversed().forEachIndexed { index, c ->
// 123,123,123
if ((index + 1) % 3 == 0) {
if (index != this.length - 1) {
sb.append("$c,")
} else {
sb.append(c)
}
} else {
sb.append(c)
}
}


return sb.toString().reversed()
}

Recommended and preferred way is to do it with the strings.xml file

<string name="format_denominated">%,d</string>

from your Kotlin/Java code

getResources().getString(R.string.format_denominated, value)

Even better with databinding

<TextView
android:text="@{@string/format_denominated(value)}"
............/>