我有 2 个编辑文本和 1 个 TextView 。 1 个用于输入价格的编辑文本,另一个用于输入百分比, TextView 将显示它们的结果 (价格 * 百分比/100)
并且我想进行第一个编辑文本输入(对于价格)更改输入的格式并将其以十进制格式显示在相同的编辑文本上。例如:
edittext1
100
用户输入 100 时,它只会显示 100,但是当用户输入一个或多个数字时,它会每 3 个数字添加“,”
edittext1
1,000
edittext1
10,000
edittext1
100,000
edittext1
1,000,000
and so on
我有这些功能,一个会自动计算 textview1 的值,另一个会自动转换 edittext 的输入。然而,它们不能一起工作,因为计算函数的格式使用 int/long/double ,而转换器使用decimalformat 。如果我使用它们,应用程序将崩溃,javanumberformatexception
无法解析int“1,000”(如果我们将1000放入edittext)
我的自动计算函数
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simulasikredit);
ethint1 = (EditText) findViewById(R.id.ethint);
etpersen2 = (EditText) findViewById(R.id.etpersen);
textvDP1 = (TextView) findViewById(R.id.textvDP);
etpersen2.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String text1 = ethint1.getText().toString();
String text2 = etpersen2.getText().toString();
long input1 = 0;
long input2 = 0;
if(text1.length()>0)
input1 = Long.valueOf(text1);
if(text2.length()>0)
input2 = Long.valueOf(text2);
if (text1.length() != 0) {
long output = (input1 * input2) / 100;
textvDP1.setText(""+output);
}
else if(text2.length() == 0){
textvDP1.setText("");
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
}); }
et代表edittext,tv代表textview
和makedecimal函数
public void makedecimal(View v)
{
ethint1.setRawInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
DigitsKeyListener dkl = new DigitsKeyListener(true,true);
ethint1.setKeyListener(dkl);
ethint1.addTextChangedListener(new TextWatcher(){
private String current = "";
@Override
public void afterTextChanged(Editable s) {
String userInput=s.toString();
if(!userInput.toString().equals(current)){
ethint1.removeTextChangedListener(this);
String cleanString = userInput.replaceAll("[,]", "");
if(cleanString.length()>0){
double parsed = Double.parseDouble(cleanString);
String formated = DecimalFormat.getNumberInstance().format(parsed);
current = formated;
ethint1.setText(formated);
ethint1.setSelection(formated.length());
}else{
ethint1.setText(cleanString);
ethint1.setSelection(cleanString.length());
}
ethint1.addTextChangedListener(this);
}
这个makedecimal是来自ethint的android:onClick
,ethint是id(这两个来自1个edittext)
最佳答案
在我们需要格式化以千为单位的数字并支持分数之前,我需要满足类似的要求。
我的方法是每次输入更改时注册一个 TextWatcher
格式的文本,并提供一个公共(public)方法通过剥离分隔符来获取数值,这是相当棘手的。我的解决方案还通过利用 DecimalFormatSymbols
来满足特定于区域设置的分隔符。类。
private final char GROUPING_SEPARATOR = DecimalFormatSymbols.getInstance().getGroupingSeparator();
private final char DECIMAL_SEPARATOR = DecimalFormatSymbols.getInstance().getDecimalSeparator();
...
/**
* Return numeric value repesented by the text field
* @return numeric value or {@link Double.NaN} if not a number
*/
public double getNumericValue() {
String original = getText().toString().replaceAll(mNumberFilterRegex, "");
if (hasCustomDecimalSeparator) {
// swap custom decimal separator with locale one to allow parsing
original = StringUtils.replace(original,
String.valueOf(mDecimalSeparator), String.valueOf(DECIMAL_SEPARATOR));
}
try {
return NumberFormat.getInstance().parse(original).doubleValue();
} catch (ParseException e) {
return Double.NaN;
}
}
/**
* Add grouping separators to string
* @param original original string, may already contains incorrect grouping separators
* @return string with correct grouping separators
*/
private String format(final String original) {
final String[] parts = original.split("\\" + mDecimalSeparator, -1);
String number = parts[0] // since we split with limit -1 there will always be at least 1 part
.replaceAll(mNumberFilterRegex, "")
.replaceFirst(LEADING_ZERO_FILTER_REGEX, "");
// only add grouping separators for non custom decimal separator
if (!hasCustomDecimalSeparator) {
// add grouping separators, need to reverse back and forth since Java regex does not support
// right to left matching
number = StringUtils.reverse(
StringUtils.reverse(number).replaceAll("(.{3})", "$1" + GROUPING_SEPARATOR));
// remove leading grouping separator if any
number = StringUtils.removeStart(number, String.valueOf(GROUPING_SEPARATOR));
}
// add fraction part if any
if (parts.length > 1) {
number += mDecimalSeparator + parts[1];
}
return number;
}
这里详细说明是相当乏味的,所以我只提供一个链接供您自己阅读: https://gist.github.com/hidroh/77ca470bbb8b5b556901
关于android 如何同时拥有edittext自动格式本身和可计算的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28761820/