コンバーターアプリケーションを作成しています。EditText を設定して、ユーザーが変換する数値を入力するときに、千、百万、十億などの 3 桁ずつ増加すると、リアルタイムで千の区切り文字 (
),
が数値に自動的に追加されるようにします。
4 桁以下になると数値は正常に戻ります。
何か助けはありますか?
15 に答える
最後に問題を解決しました
とはいえ、答えが遅すぎます。適切な結果を得るためにタスクを達成するために多くのことを調査しましたが、できませんでした。それで、私たちが検索していた問題を最終的に解決し、検索にかかる時間を節約するためにこの回答をGoogle検索者に提供しました.
以下のコードの特徴
EditText
テキストの変更に合わせて桁区切り記号を挿入します。0.
最初にピリオド (.) を押すと自動的に追加されます。0
開始時の入力を無視します。
次の名前のクラスをコピーするだけです
TextWatcherを実装する NumberTextWatcherForThousand
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import java.util.StringTokenizer;
/**
* Created by skb on 12/14/2015.
*/
public class NumberTextWatcherForThousand implements TextWatcher {
EditText editText;
public NumberTextWatcherForThousand(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 != null && !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);
return;
}
catch (Exception ex)
{
ex.printStackTrace();
editText.addTextChangedListener(this);
}
}
public 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++;
}
}
public static String trimCommaOfString(String string) {
// String returnString;
if(string.contains(",")){
return string.replace(",","");}
else {
return string;
}
}
}
このクラスを次のように使用しEditText
ます
editText.addTextChangedListener(new NumberTextWatcherForThousand(editText));
入力をプレーンな Double Text として取得するには
trimCommaOfString
このように同じクラスのメソッドを使用します
NumberTextWatcherForThousand.trimCommaOfString(editText.getText().toString())
String.format()
で使用できますTextWatcher
。フォーマット指定子のコンマはそのトリックを行います。
これは、浮動小数点入力では機能しません。また、TextWatcher で無限ループを設定しないように注意してください。
public void afterTextChanged(Editable view) {
String s = null;
try {
// The comma in the format specifier does the trick
s = String.format("%,d", Long.parseLong(view.toString()));
} catch (NumberFormatException e) {
}
// Set s back to the view after temporarily removing the text change listener
}
このサンプル アプリは、数値の書式設定を明確に分解します。
上記のリンクを要約するには、次のロジックを使用TextWatcher
してafterTextChanged()
メソッド形式のビューで and を使用します。EditText
@Override
public void afterTextChanged(Editable s) {
editText.removeTextChangedListener(this);
try {
String originalString = s.toString();
Long longval;
if (originalString.contains(",")) {
originalString = originalString.replaceAll(",", "");
}
longval = Long.parseLong(originalString);
DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance(Locale.US);
formatter.applyPattern("#,###,###,###");
String formattedString = formatter.format(longval);
//setting text after format to EditText
editText.setText(formattedString);
editText.setSelection(editText.getText().length());
} catch (NumberFormatException nfe) {
nfe.printStackTrace();
}
editText.addTextChangedListener(this);
}
私は同じ問題を抱えていたので、解決策を見つけることにしました
以下の私の機能を見つけてください。人々が解決策を見つけるのに役立つことを願っています
securityDeposit.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start,
int before, int count) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
if (s.toString().trim().length() > 0) {
int rentValue = Integer.parseInt(s.toString()
.replaceAll(",", ""));
StringBuffer rentVal = new StringBuffer();
if (rentValue > 10000000) {
s.clear();
s.append("10,000,000");
} else {
if (s.length() == 4) {
char x[] = s.toString().toCharArray();
char y[] = new char[x.length + 1];
for (int z = 0; z < y.length; z++) {
if (z == 1) {
y[1] = ',';
} else {
if (z == 0)
y[z] = x[z];
else {
y[z] = x[z - 1];
}
}
}
for (int z = 0; z < y.length; z++) {
rentVal = rentVal.append(y[z]);
}
s.clear();
s.append(rentVal);
}
}
}
}
});