格式化包含操作和数字的字符串

时间:2018-08-08 14:06:16

标签: java android regex kotlin

我只想格式化一个包含操作和数字的字符串。

例如: 1035+56-7894*9985.31,035+56-7,894*9,985.3

我只需要每3位添加一个逗号。 我只想照顾数字,而忽略运算和其他不是数字的东西。

4 个答案:

答案 0 :(得分:2)

您可以像使用Kotlins Regex #replace一样替换数字并保留其他所有内容:

val input = "1035+56-7894*9985.3"

val numberRegex = Regex("[\\d,.]+") // this actually filters out consecutives digits, commas and dots 

val result = numberRegex.replace(input) { 
    val num = BigDecimal(it.value)
    "%,.2f".format(Locale.US, num)
}

println(result)

将为您的示例打印以下内容:

1,035.00+56.00-7,894.00*9,985.30

或者,如果您确实必须保留小数位,请改用以下格式:

"%,.${max(0, num.stripTrailingZeros().scale())}f".format(Locale.US, num)

将打印:

1,035+56-7,894*9,985.3

答案 1 :(得分:1)

这是一个非常接近您的预期输出的脚本:

String input = "1035+56-7894*9985.3";
String[] parts = input.split("(?<=[+*/-])|(?=[+*/-])");
StringBuilder sb = new StringBuilder("");
for (String part : parts) {
    if (!part.equals("+") && !part.equals("-") && !part.equals("*") && !part.equals("/")) {
        double num = Double.parseDouble(part);
        StringBuilder temp = new StringBuilder();
        Formatter formatter = new Formatter(temp, Locale.US);
        formatter.format("%,.2f", num);
        sb.append(temp);
    }
    else {
        sb.append(part);
    }
}

System.out.println(sb);

1,035.00+56.00-7,894.00*9,985.30

Demo

此答案的秘密在于将您的算术字符串拆分为以下模式:

(?<=[+*/-])|(?=[+*/-])

这将在操作符号之前或之后拆分,同时将这些符号保留为结果数组中的项。这样一来,我们就可以轻松地迭代字符串数组,然后格式化数字,从而在以后需要重建原始算术表达式时可以轻敲符号。

然后,对于每个数字,我们将其格式化为带有逗号分隔符的两位小数。

答案 2 :(得分:1)

下面的代码通过在格式化表达式时动态更改小数点后的位数来添加到“ Tim Biegeleisen”解决方案中。

1)Demo.class:----------

public class Demo extends AppCompatActivity {

private EditText edt;
private TextView tv;
private Button b;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.demo);

    edt = (EditText) findViewById(R.id.edt);
    tv = (TextView) findViewById(R.id.tv);
    b = (Button) findViewById(R.id.b);
    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            StringBuilder sb = new StringBuilder();
            String input = edt.getText().toString();
            if (!input.isEmpty()) {
                String[] parts = input.split("(?<=[+*/-])|(?=[+*/-])");
                for (String part : parts) {
                    if (!part.equals("+") && !part.equals("-") && !part.equals("*") && !part.equals("/")) {
                        double num = Double.parseDouble(part);
                        StringBuilder temp = new StringBuilder();
                        if (!isValidInteger(part)) { // if number is a decimal
                            int number_of_digits_after_decimal_point = 2;
                            try {
                                String[] part_split = part.split("\\."); // split number based on "."
                                if (part_split.length == 2) {
                                        number_of_digits_after_decimal_point = part_split[1].length(); // set number_of_digits_after_decimal_point to be equal to the
                                    // length of the string after the decimal point.
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                            Formatter formatter = new Formatter(temp, Locale.US);
                            formatter.format("%,." + number_of_digits_after_decimal_point + "f", num);
                            sb.append(temp);
                        } else { // if number is an integer
                            Formatter formatter = new Formatter(temp, Locale.US);
                            formatter.format("%,.0f", num);
                            sb.append(temp);
                        }
                    } else {
                        sb.append(part);
                    }
                }
            } else {
                Toast.makeText(getApplicationContext(), "Empty", Toast.LENGTH_LONG).show();
            }

            tv.setText(sb.toString());
        }
    });
}

public static boolean isValidInteger(String value) {
    if (value == null) {
        return false;
    } else {
        try {
            Integer val = Integer.valueOf(value);
            if (val != null)
                return true;
            else
                return false;
        } catch (NumberFormatException e) {
            e.printStackTrace();
            return false;
        }
    }
}

}

2)demo.xml:---------

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dp"
    android:layout_gravity="center"
    android:id="@+id/edt"
    android:hint="Input"/>

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dp"
    android:layout_gravity="center"
    android:text="Output"
    android:id="@+id/tv"/>

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dp"
    android:layout_gravity="center"
    android:text="Convert"
    android:id="@+id/b"/>

</LinearLayout>

3)输出:---------

Output

答案 3 :(得分:0)

这是我的解决方案,它是特定于语言环境的:

    String startString = "1035+56-7894*9985.3";
    String signs = startString.replaceAll("[^-+*/]", "") + " ";
    String[] numbers = startString
        .replaceAll(",", ".")
        .replaceAll("[-+*/]", " ")
        .split(" ");

    DecimalFormat nf = new DecimalFormat("#,###.#");

    StringBuilder targetString = new StringBuilder();
    for (int i = 0; i < numbers.length; i++) {
        targetString.append(nf.format(Double.parseDouble(numbers[i]))).append(signs, i, i + 1);
    }
    targetString = new StringBuilder(targetString.toString().trim());

    System.out.println(targetString);

打印:

1,035+56-7,894*9,985.3

1.035+56-7.894*9.985,3

取决于语言环境设置。