【问题标题】:Converting all float values in String from scientific notation to decimal notation将字符串中的所有浮点值从科学计数法转换为十进制计数法
【发布时间】:2017-11-28 20:26:34
【问题描述】:

所以我有一个看起来像这样的 xml 字符串:

<CONFIG><Setting1><o1>44</o1><o2>1.0E-4</o2><o3>955</o3><o4>1.5E-4</o4><o5>Surname</o5></setting1>....</CONFIG>

我将如何将字符串中的每个浮点数从科学概念转换为十进制?

编辑:澄清一下,我不希望仅将单个浮点值从科学国家转换为十进制国家。字符串是从我从 pojo 序列化的 xml 文件中读取的,因此字符串中的所有浮点值都需要转换。遗憾的是,我使用的 XML 框架 (SimpleXML) 仅表示科学计数法中的浮点数。

更新: 尝试使用 RegEx 查找浮点值,它可以工作。 “found”将是新转换的小数。我将如何用“found”-String 替换每个找到的模式?

    public static void ScientificToDecimal(String text){
    String found;
    Pattern pattern = Pattern.compile("\\d+[.]\\d+E[+-]\\d");
    Matcher matcher = pattern.matcher(text);
    while(matcher.find()){
        found = new BigDecimal(matcher.group()).toPlainString();
        Log.i("Converted: ", matcher.group() + " to " + found);
        }
    }

UPDATE2:对我来说已经足够好了。

    public static String scientificToDecimal(String text){
    String replacementText = "";
    StringBuffer sb = new StringBuffer();

    Pattern pattern = Pattern.compile("\\d+[.]\\d+E[+-]\\d");
    Matcher matcher = pattern.matcher(text);

    while(matcher.find()){

        replacementText = new BigDecimal(matcher.group()).toPlainString();
        matcher.appendReplacement(sb,replacementText);
        Log.i("Converted: ", matcher.group() + " to " + replacementText);
    }
    matcher.appendTail(sb);

    return sb.toString();
    }

【问题讨论】:

  • 你有什么尝试吗?
  • 您可以使用BigDecimal。例如. String result = new BigDecimal("1.0E-4").toPlainString();
  • @OliverCharlesworth 我知道我可以使用 BigDecimal 转换单个值,但我需要解析整个字符串并将每个浮点数转换为十进制表示法。最初的 XML 字符串也更长,并且在 E-notation 中可能有大约 100 个浮点数需要转换为十进制表示法。不太确定如何进行解析。
  • 您确实需要 XPath 来可靠地提取文本值,并且需要 Double.parseDouble()BigDecimal 来进行转换。

标签: java android


【解决方案1】:

想想那些模式 &gt;1.0E-4&lt;&gt;1.5E-4&lt; 以及 RegEx 和字符串替换等等。

【讨论】:

  • 嘿,谢谢。我对java还是很陌生,只是阅读了正则表达式。这适合 \d+.\d+E[-+]\d 吗?另外,要找到模式,我可以使用模式/匹配器吗?
【解决方案2】:

使用XMLPullParser(请参阅guide)获取双精度值,然后使用herehere 描述的技术进行转换,可能使用您的正则表达式。

【讨论】:

  • 不能简单地用转换后的值替换 matcher.find() 中当前选择的模式吗?它就像一个魅力,我正在取回我实际需要转换的所有值。无论如何,我会看看 xmlpullparser,谢谢。
  • 诚然,我不太了解 SimpleXML 或您正在使用它做什么。但如果 I 从 XML 中提取值,我不会使用正则表达式引擎。 stackoverflow.com/a/1732454/1224741
  • SimpleXML 部分已经完成并且可以工作了。我现在只有一个 XML 字符串,我将其视为普通字符串。基本上用正则表达式找到所有浮点值,我还可以提取并将它们从科学记数法转换为十进制记数法。我正在努力的部分是用转换后的浮点值替换科学计数法中找到的浮点值。而且由于它们都是不同的,我不能做 String.replaceAll()。我查看了 XMLPullparser,但这也不能一个接一个地替换值。
  • 您应该解析 XML 并使用每个链接转换的值重新发送。放弃正则表达式的废话,它是工作的错误工具。
【解决方案3】:

只是为了增强处理以下场景

a) 1.0E-4 b) 1.0E4 c) 1.0E+4

public static String scienceToDecimal(String text){

    String out = "";
    boolean found = false;
    String replacementText = "";
    StringBuffer sb = new StringBuffer();

    /*
     * 5.0E4
     */
    Pattern pattern = Pattern.compile("\\d+[.]\\d+E\\d");
    Matcher matcher = pattern.matcher(text);
    while(matcher.find()){

        replacementText = new BigDecimal(matcher.group()).toPlainString();
        matcher.appendReplacement(sb,replacementText);
        found = true;
        // System.out.println("Converted: " + matcher.group() + " to " + replacementText);
    }
    if ( found )
    {
        matcher.appendTail(sb);
        out = sb.toString();
        return out;
    }

    /*
     * 5.0E-4
     */
    pattern = Pattern.compile("\\d+[.]\\d+E[-+]\\d");
    matcher = pattern.matcher(text);
    while(matcher.find()){

        replacementText = new BigDecimal(matcher.group()).toPlainString();
        matcher.appendReplacement(sb,replacementText);
        // System.out.println("Converted: " + matcher.group() + " to " + replacementText);
    }
    matcher.appendTail(sb);
    out = sb.toString();
    return out;
}

【讨论】:

    猜你喜欢
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 2020-06-10
    • 2015-08-19
    • 2011-11-19
    相关资源
    最近更新 更多