Android 文本更改时将数字转换为货币格式
我正在使用Android 文本更改时将数字转换为货币格式,android,rx-android,android-textwatcher,Android,Rx Android,Android Textwatcher,我正在使用rxtview.textChanges进行EditText操作,当用户键入EditText的值时,将数字转换为货币格式,如下所示: 1,000 但我看不到任何将数字转换为货币格式的 我正在使用from:NumberFormat.getNumberInstance(Locale.US).format(productPrice) 我的代码如下: Observable<CharSequence> observableDiscountPrice = RxTextView.text
rxtview.textChanges
进行EditText
操作,当用户键入EditText
的值时,将数字转换为货币格式,如下所示:
1,000
但我看不到任何将数字转换为货币格式的
我正在使用from:NumberFormat.getNumberInstance(Locale.US).format(productPrice)代码>
我的代码如下:
Observable<CharSequence> observableDiscountPrice = RxTextView.textChanges(discountPriceEdittext);
observableDiscountPrice.map(new Function<CharSequence, Boolean>() {
@Override
public Boolean apply(@io.reactivex.annotations.NonNull CharSequence charSequence) throws Exception {
try {
if (charSequence.length() > 0) {
String pPrice = NumberFormat.getNumberInstance(Locale.US).format(charSequence.toString());
originalPriceEdittext.setText(String.valueOf(pPrice));
return true;
} else {
return false;
}
} catch (Exception e) {
return true;
}
}
}).subscribe(new Subject<Boolean>() {
@Override
public boolean hasObservers() {
return false;
}
@Override
public boolean hasThrowable() {
return false;
}
@Override
public boolean hasComplete() {
return false;
}
@Override
public Throwable getThrowable() {
return null;
}
@Override
protected void subscribeActual(Observer<? super Boolean> observer) {
}
@Override
public void onSubscribe(@io.reactivex.annotations.NonNull Disposable d) {
}
@Override
public void onNext(@io.reactivex.annotations.NonNull Boolean aBoolean) {
}
@Override
public void onError(@io.reactivex.annotations.NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
Observable observableDiscoveryPrice=RxTextView.textChanges(折扣价格编辑文本);
observedictionprice.map(新函数(){
@凌驾
公共布尔应用(@io.reactivex.annotations.NonNull CharSequence CharSequence)引发异常{
试一试{
if(charSequence.length()>0){
字符串pPrice=NumberFormat.getNumberInstance(Locale.US).format(charSequence.toString());
originalPriceEdittext.setText(String.valueOf(pPrice));
返回true;
}否则{
返回false;
}
}捕获(例外e){
返回true;
}
}
}).订阅(新主题(){
@凌驾
公共布尔hasObservators(){
返回false;
}
@凌驾
公共布尔hastrowable(){
返回false;
}
@凌驾
公共布尔hasComplete(){
返回false;
}
@凌驾
公共可丢弃的可获取的(){
返回null;
}
@凌驾
受保护的无效订阅实际(观察者查看
使用此TextWatcher类:
public class NumberTextWatcherWithSeperator implements TextWatcher {
private EditText editText;
public NumberTextWatcherWithSeperator(EditText editText) {
this.editText = editText;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
try {
editText.removeTextChangedListener(this);
String value = editText.getText().toString();
if (!value.equals("")) {
if (value.startsWith(".")) {
editText.setText("0.");
}
if (value.startsWith("0") && !value.startsWith("0.")) {
editText.setText("");
}
String str = editText.getText().toString().replaceAll(",", "");
if (!value.equals(""))
editText.setText(getDecimalFormattedString(str));
editText.setSelection(editText.getText().toString().length());
}
editText.addTextChangedListener(this);
} catch (Exception ex) {
ex.printStackTrace();
editText.addTextChangedListener(this);
}
}
private static String getDecimalFormattedString(String value) {
StringTokenizer lst = new StringTokenizer(value, ".");
String str1 = value;
String str2 = "";
if (lst.countTokens() > 1) {
str1 = lst.nextToken();
str2 = lst.nextToken();
}
String str3 = "";
int i = 0;
int j = -1 + str1.length();
if (str1.charAt(-1 + str1.length()) == '.') {
j--;
str3 = ".";
}
for (int k = j; ; k--) {
if (k < 0) {
if (str2.length() > 0)
str3 = str3 + "." + str2;
return str3;
}
if (i == 3) {
str3 = "," + str3;
i = 0;
}
str3 = str1.charAt(k) + str3;
i++;
}
}
}
我用这个观察者做同样的事情:
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
public class CurrencyTextWatcher implements TextWatcher {
private EditText ed;
private String lastText;
private boolean bDel = false;
private boolean bInsert = false;
private int pos;
public CurrencyTextWatcher(EditText ed) {
this.ed = ed;
}
public static String getStringWithSeparator(long value) {
DecimalFormat formatter = (DecimalFormat) NumberFormat.getNumberInstance(Locale.US);
String f = formatter.format(value);
return f;
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
bDel = false;
bInsert = false;
if (before == 1 && count == 0) {
bDel = true;
pos = start;
} else if (before == 0 && count == 1) {
bInsert = true;
pos = start;
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
lastText = s.toString();
}
@Override
public void afterTextChanged(Editable s) {
ed.removeTextChangedListener(this);
StringBuilder sb = new StringBuilder();
String text = s.toString();
for (int i = 0; i < text.length(); i++) {
if ((text.charAt(i) >= 0x30 && text.charAt(i) <= 0x39) || text.charAt(i) == '.' || text.charAt(i) == ',')
sb.append(text.charAt(i));
}
if (!sb.toString().equals(s.toString())) {
bDel = bInsert = false;
}
String newText = getFormattedString(sb.toString());
s.clear();
s.append(newText);
ed.addTextChangedListener(this);
if (bDel) {
int idx = pos;
if (lastText.length() - 1 > newText.length())
idx--;
if (idx < 0)
idx = 0;
ed.setSelection(idx);
} else if (bInsert) {
int idx = pos + 1;
if (lastText.length() + 1 < newText.length())
idx++;
if (idx > newText.length())
idx = newText.length();
ed.setSelection(idx);
}
}
private String getFormattedString(String text) {
String res = "";
try {
String temp = text.replace(",", "");
long part1;
String part2 = "";
int dotIndex = temp.indexOf(".");
if (dotIndex >= 0) {
part1 = Long.parseLong(temp.substring(0, dotIndex));
if (dotIndex + 1 <= temp.length()) {
part2 = temp.substring(dotIndex + 1).trim().replace(".", "").replace(",", "");
}
} else
part1 = Long.parseLong(temp);
res = getStringWithSeparator(part1);
if (part2.length() > 0)
res += "." + part2;
else if (dotIndex >= 0)
res += ".";
} catch (Exception ex) {
ex.printStackTrace();
}
return res;
}
}
导入android.text.Editable;
导入android.text.TextWatcher;
导入android.widget.EditText;
导入java.text.DecimalFormat;
导入java.text.NumberFormat;
导入java.util.Locale;
公共类CurrencyTextWatcher实现TextWatcher{
私人编辑文本;
私有字符串文本;
私有布尔bDel=false;
私有布尔bInsert=false;
私人国际邮政局;
公共货币文本观察者(编辑文本){
这是,ed=ed;
}
公共静态字符串getStringWithSeparator(长值){
DecimalFormat格式化程序=(DecimalFormat)NumberFormat.getNumberInstance(Locale.US);
字符串f=格式化程序.format(值);
返回f;
}
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
bDel=假;
bInsert=false;
如果(之前==1&&count==0){
bDel=真;
pos=开始;
}else if(before==0&&count==1){
bInsert=true;
pos=开始;
}
}
@凌驾
更改前文本之前的公共void(字符序列s、int start、int count、int after){
lastText=s.toString();
}
@凌驾
公共无效后文本已更改(可编辑){
ed.removeTextChangedListener(本);
StringBuilder sb=新的StringBuilder();
字符串text=s.toString();
对于(int i=0;i=0x30&&text.charAt(i)newText.length())
idx-;
if(idx<0)
idx=0;
教育署署长选举(idx);
}否则如果(宾塞特){
int idx=位置+1;
如果(lastText.length()+1newText.length())
idx=newText.length();
教育署署长选举(idx);
}
}
私有字符串getFormattedString(字符串文本){
字符串res=“”;
试一试{
字符串temp=text.replace(“,”和“”);
长部分1;
字符串部分2=“”;
int DOTDINDEX=温度指数(“.”);
如果(点索引>=0){
part1=Long.parseLong(临时子字符串(0,点索引));
如果(点索引+1 0)
res+=“+”第2部分;
否则如果(点索引>=0)
res+=”;
}捕获(例外情况除外){
例如printStackTrace();
}
返回res;
}
}
以防您想要和美元符号
fun multiply_two_numbers() {
val x = etValOne.text.toString()
val y = etValTwo.text.toString()
val c = x.toDouble().times(y.toDouble())
//val c = (x.toDouble() * y.toDouble())
val df = DecimalFormat("$ "+"0.00")
df.roundingMode = RoundingMode.CEILING
df.format(c)
etANS.setText(df.format(c))
}
@Milos Lulic。我测试过这个,但这种方法在文本更改中有错误。@Alireza Noorali。这个类在常用设备上有错误。@JoJoRoid:我已经在我的应用程序中使用过这个类,而且我的fabric crashlytics报告中从来没有发生过一次崩溃。你有没有尝试过这个类?你的代码运行得很好,但是我如何将小数点限制在2位检查您的导入是否符合NumberFormat
?
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
public class CurrencyTextWatcher implements TextWatcher {
private EditText ed;
private String lastText;
private boolean bDel = false;
private boolean bInsert = false;
private int pos;
public CurrencyTextWatcher(EditText ed) {
this.ed = ed;
}
public static String getStringWithSeparator(long value) {
DecimalFormat formatter = (DecimalFormat) NumberFormat.getNumberInstance(Locale.US);
String f = formatter.format(value);
return f;
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
bDel = false;
bInsert = false;
if (before == 1 && count == 0) {
bDel = true;
pos = start;
} else if (before == 0 && count == 1) {
bInsert = true;
pos = start;
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
lastText = s.toString();
}
@Override
public void afterTextChanged(Editable s) {
ed.removeTextChangedListener(this);
StringBuilder sb = new StringBuilder();
String text = s.toString();
for (int i = 0; i < text.length(); i++) {
if ((text.charAt(i) >= 0x30 && text.charAt(i) <= 0x39) || text.charAt(i) == '.' || text.charAt(i) == ',')
sb.append(text.charAt(i));
}
if (!sb.toString().equals(s.toString())) {
bDel = bInsert = false;
}
String newText = getFormattedString(sb.toString());
s.clear();
s.append(newText);
ed.addTextChangedListener(this);
if (bDel) {
int idx = pos;
if (lastText.length() - 1 > newText.length())
idx--;
if (idx < 0)
idx = 0;
ed.setSelection(idx);
} else if (bInsert) {
int idx = pos + 1;
if (lastText.length() + 1 < newText.length())
idx++;
if (idx > newText.length())
idx = newText.length();
ed.setSelection(idx);
}
}
private String getFormattedString(String text) {
String res = "";
try {
String temp = text.replace(",", "");
long part1;
String part2 = "";
int dotIndex = temp.indexOf(".");
if (dotIndex >= 0) {
part1 = Long.parseLong(temp.substring(0, dotIndex));
if (dotIndex + 1 <= temp.length()) {
part2 = temp.substring(dotIndex + 1).trim().replace(".", "").replace(",", "");
}
} else
part1 = Long.parseLong(temp);
res = getStringWithSeparator(part1);
if (part2.length() > 0)
res += "." + part2;
else if (dotIndex >= 0)
res += ".";
} catch (Exception ex) {
ex.printStackTrace();
}
return res;
}
}
fun multiply_two_numbers() {
val x = etValOne.text.toString()
val y = etValTwo.text.toString()
val c = x.toDouble().times(y.toDouble())
//val c = (x.toDouble() * y.toDouble())
val df = DecimalFormat("$ "+"0.00")
df.roundingMode = RoundingMode.CEILING
df.format(c)
etANS.setText(df.format(c))
}