【问题标题】:Replace all commas with periods and vice versa in a string?用句点替换所有逗号,反之亦然?
【发布时间】:2020-07-24 11:36:53
【问题描述】:

如果可能,尝试找出如何使用 Kotlin 序列一次性完成此操作。我不认为基于 Locale 的数字格式是可能的,因为我有时会有像 1. 或 1, 那样抛出 NumberFormatException 的字符串。需要在没有任何数字转换的情况下执行此操作。

  • 12,345.6789 -> 12.345,6789
  • 12.345,6789 -> 12,345.6789
  • 。 -> ,
    1. -> 1,

【问题讨论】:

  • @Eugene 怎么样? "12,345.6789".replaceAll(",", ".") 会给我 "12.345.6789" 吗?
  • 对,我提供了答案
  • @nicoqueijo - 您可以使用String::replace。检查this
  • 字符串从何而来?大概它是从一个数字开始的。是否有任何选项可以改变它首先转换为字符串的方式,以避免以后弄乱它?
  • 关于您在软件工程上发布的关于您的 Github 页面的问题,您应该向 Google Play 提交 DMCA 删除通知:support.google.com/legal/troubleshooter/1114905

标签: java string kotlin java-stream sequence


【解决方案1】:

这可能是一个非常幼稚的解决方案,但如果您知道您的字符串中只会包含数字,那么这将起作用。

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

【讨论】:

  • 我真的不明白你的解决方案有多容易。
  • 如果x 出现在输入中,则它不会中断更容易;不像你的。更容易推理,这就是我的意思。
  • 当然,但我认为他是在为他的用例寻求一个简单的解决方案。因此,我认为实例化 3 个对象并经历一个 while 循环是没有意义的。
  • 根据我阅读问题的理解,字符串由数字、逗号和句点表示。因此,我认为简化解决方案没有问题。 :)
  • “实例化 3 个对象”。您正在实例化四个中间对象,只是隐藏在 replace 调用中。但最昂贵的方面是在操作过程中复制整个字符串内容,这里发生了 3 次,而在另一种解决方案中只发生了一次。
【解决方案2】:

您可以将一个字符替换为未使用的字符:

String str = "1234.123213,414";
str = str.replace(",", "+");
str = str.replace(".", ",");
str = str.replace("+", ".");
System.out.println("str = " + str); 
// Output: str = 1234,123213.414

【讨论】:

    【解决方案3】:

    您可以为此目的使用此代码:-

    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);
    

    希望这会有所帮助。

    【讨论】:

      【解决方案4】:
          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());
      

      【讨论】:

      • Java 9 中添加了StringBuilder 支持。在旧版本中,您需要StringBuffer。但是当你使用 Java 9 或更新版本时,你也可以使用Pattern.compile("[,.]").matcher( "123.456,789").replaceAll(mr -> mr.group().equals(".")? ",": ".")
      【解决方案5】:
      String::replaceAll(a, b)
      

      可以将任何出现的子字符串a 替换为子字符串b

      但是,要进行交换,您需要应用此方法 3 次,如下所示:

      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.
      

      【讨论】:

        【解决方案6】:

        如何使用 Streams:

        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.
        

        【讨论】:

          【解决方案7】:

          一口气。不使用任何 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

          这是相当低级的,所以请把它包装成一个好名字的方法。否则我认为这是直截了当的。如果您更喜欢使用StringBufferStringBuilder,这些也是选项。

          不过,如果是我,我会再考虑一下号码解析和格式化。

          【讨论】:

          • “这些也是选项”,但考虑到您只是更改字符值(而不是插入或删除),它们并没有带来任何特别的优势。
          • @AndyTurner 在这里找到了实现细节,但是对于参考实现和 Java 9 或更高版本,使用 StringBuilder 有可能以每个字符一个字节而不是两个字节来执行整个操作。相比之下,使用char[] 不仅缺乏这种潜力,还需要String 构造函数来检查数组是否包含非latin-1 字符。
          【解决方案8】:

          只需使用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
          

          【讨论】:

            【解决方案9】:

            您可以在String 上使用map 函数并将生成的List&lt;Char&gt; 转换为joinToString()。这是一次替换,但必须将其复制回字符串。

            fun String.swapCommasAndDots() = map { c ->
                when (c) {
                    ',' -> '.'
                    '.' -> ','
                    else -> c
                }
            }.joinToString("")
            

            【讨论】:

              猜你喜欢
              • 2019-03-17
              • 2021-09-30
              • 2019-12-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多