Заменить все запятые точками и наоборот в строке? - PullRequest
1 голос
/ 11 апреля 2020

Попытка выяснить, как сделать это за один проход, используя последовательности Kotlin, если это возможно. Я не думаю, что форматирование чисел на основе Locale возможно, так как у меня иногда есть строки, которые выдают NumberFormatException вроде 1. или 1,. Нужно сделать это без каких-либо преобразований чисел.

  • 12,345.6789 -> 12,345,6789
  • 12,345,6789 -> 12,345.6789
  • . ->,
    1. -> 1,

Ответы [ 9 ]

2 голосов
/ 11 апреля 2020

за один проход. Не используя Kotlin, я могу написать только Java.

    String s = "12,345.6789";
    char[] ca = s.toCharArray();
    for (int i = 0; i < ca.length; i++) {
        if (ca[i] == '.') {
            ca[i] = ',';
        } else if (ca[i] == ',') {
            ca[i] = '.';
        }
    }
    s = new String(ca);
    System.out.println(s);

Вывод:

12,345,6789

Это довольно низко уровень, поэтому, пожалуйста, включите его в метод с хорошим именем. В противном случае я думаю, что это просто. Если вы предпочитаете использовать StringBuffer или StringBuilder, это тоже варианты.

Я бы дал разбор и форматирование еще одной мысли, если бы это был я.

1 голос
/ 12 апреля 2020

Вы можете использовать функцию map для String и преобразовать полученный List<Char> с помощью joinToString(). Это один проход для замены, но его нужно скопировать обратно в строку.

fun String.swapCommasAndDots() = map { c ->
    when (c) {
        ',' -> '.'
        '.' -> ','
        else -> c
    }
}.joinToString("")
0 голосов
/ 11 апреля 2020

Просто используйте String::replace следующим образом:

public class Main {
    public static void main(String args[]) {
        // Tests
        System.out.println(swapCommaWithDot("1,123,345.6789"));
        System.out.println(swapCommaWithDot("1.123.345,6789"));
    }

    static String swapCommaWithDot(String n) {
        return n.replace(",", ",.").replace(".", ",").replace(",.", ".").replace(",,", ".");
    }
}

Вывод:

1.123.345,6789
1,123,345.6789
0 голосов
/ 11 апреля 2020

Как насчет использования потоков:

static String swapChars(String str, String c1, String c2)
{
    return Stream.of(str.split(c1, -1))
          .map (elem -> elem.replace(c2, c1))
          .collect(Collectors.joining(c2));
}

Тест:

for(String s : new String[] {"12,345.6789", "12.345,6789", ".", "1." ,"1,"})
    System.out.format("%s -> %s%n", s, swapChars(s, ",", ".") );

Вывод:

12,345.6789 -> 12.345,6789
12.345,6789 -> 12,345.6789
. -> ,
1. -> 1,
1, -> 1.
0 голосов
/ 11 апреля 2020
String::replaceAll(a, b)

может заменить любые вхождения подстроки a для подстроки b.

Однако для выполнения подкачки необходимо применить этот метод три раза, например:

String number = "123,456.05";
number = number.replaceAll(",", "&").replaceAll(".", ",").replaceAll("&", ".");

Обычно, чтобы поменять символы, это выглядит так:

  1. вы заменяете запятую для подстроки-заполнителя (может быть что угодно)
  2. вы конвертируете все точки в запятые
  3. вы конвертируете заполнители в точки.

Если бы не заполнитель, вы бы получили все запятые.

number.replaceAll(",", ".").replaceAll(".", ",");
//this would transform commas into dots, then the same transformed commas would become commas again.
0 голосов
/ 11 апреля 2020
    String in = "12,345.6789";

    Pattern p = Pattern.compile("[,.]");
    Matcher m = p.matcher(in);
    StringBuilder sb = new StringBuilder();

    while (m.find()) {
        m.appendReplacement(sb, m.group().equals(".") ? "," : ".");
    }

    m.appendTail(sb);

    System.out.println(sb.toString());
0 голосов
/ 11 апреля 2020

Вы можете использовать этот код для этой цели: -

String num = "12,345.6789";
//Replacing all '.' to '}' Just for the sake of simplicity
String transformednum = num.replace('.', '}');
//Replacing all ',' to '.'  First Thing you want
transformednum = transformednum.replace(',', '.');
//Replacing all '}' to ','   Second thing you want 
transformednum = transformednum.replace('}', ',');
System.out.println(transformednum);

Надеюсь, это поможет.

0 голосов
/ 11 апреля 2020

Вы можете заменить один символ чем-то неиспользованным:

String str = "1234.123213,414";
str = str.replace(",", "+");
str = str.replace(".", ",");
str = str.replace("+", ".");
System.out.println("str = " + str); 
// Output: str = 1234,123213.414
0 голосов
/ 11 апреля 2020

Это может быть очень наивное решение, но если вы знаете, что в вашей строке будут только цифры, это сработает.

var oldString = "12,345.6789"
var newString = oldString
    .replace('.', 'x')
    .replace(',', '.')
    .replace('x', ',')
print(newString)
// 12.345,6789
...