เช่นเดียวกับคนอื่น ๆ กล่าวว่าฉันเพิ่มชั้นเรียนนี้ในโครงการของฉันและตั้งค่าตัวกรองเป็นที่EditText
ฉันต้องการ
คัดลอกตัวกรองมาจากคำตอบของ @ Pixel ฉันแค่รวบรวมทั้งหมดเข้าด้วยกัน
public class DecimalDigitsInputFilter implements InputFilter {
Pattern mPattern;
public DecimalDigitsInputFilter() {
mPattern = Pattern.compile("([1-9]{1}[0-9]{0,2}([0-9]{3})*(\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\.[0-9]{0,2})?|0(\\.[0-9]{0,2})?|(\\.[0-9]{1,2})?)");
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
String formatedSource = source.subSequence(start, end).toString();
String destPrefix = dest.subSequence(0, dstart).toString();
String destSuffix = dest.subSequence(dend, dest.length()).toString();
String result = destPrefix + formatedSource + destSuffix;
result = result.replace(",", ".");
Matcher matcher = mPattern.matcher(result);
if (matcher.matches()) {
return null;
}
return "";
}
}
ตอนนี้ตั้งค่าตัวกรองในEditText
แบบนี้
mEditText.setFilters(new InputFilter[]{new DecimalDigitsInputFilter()});
ที่นี่สิ่งสำคัญอย่างหนึ่งคือมันช่วยแก้ปัญหาของฉันที่ไม่อนุญาตให้แสดงมากกว่าสองหลักหลังจุดทศนิยมEditText
แต่ปัญหาคือเมื่อฉันgetText()
จากนั้นEditText
มันจะส่งคืนอินพุตทั้งหมดที่ฉันพิมพ์
ตัวอย่างเช่นหลังจากใช้ตัวกรองบนตัวกรองEditText
ฉันพยายามตั้งค่าอินพุต 1.5699856987 ดังนั้นในหน้าจอจะแสดง 1.56 ซึ่งสมบูรณ์แบบ
จากนั้นฉันต้องการใช้อินพุตนี้สำหรับการคำนวณอื่น ๆ ดังนั้นฉันจึงต้องการรับข้อความจากฟิลด์อินพุตนั้น ( EditText
) เมื่อฉันเรียกmEditText.getText().toString()
มันกลับ 1.5699856987 ซึ่งไม่สามารถยอมรับได้ในกรณีของฉัน
ดังนั้นฉันจึงต้องแยกวิเคราะห์ค่าอีกครั้งหลังจากได้รับจากไฟล์EditText
.
BigDecimal amount = new BigDecimal(Double.parseDouble(mEditText.getText().toString().trim()))
.setScale(2, RoundingMode.HALF_UP);
setScale
เคล็ดลับที่นี่หลังจากได้รับข้อความเต็มจากไฟล์EditText
.