【问题标题】:Treat octal numbers as decimals将八进制数视为小数
【发布时间】:2016-08-16 13:02:50
【问题描述】:

我正在学习 JAVA,最近在一些训练任务中遇到了同样的问题。

我有一些数字,其中一些以 0 开头。我发现这些数字是八进制的,这意味着它不是我想要的数字,或者它给了我一个错误(因为“8”或“9”,因为它们不是八进制数字)在我将其读取为 int 或 long ...

到目前为止,我只需要使用两位数,例如 14 或 05。 我将它们视为字符串并使用检查所有字符串数字并将它们转换为这样的数字的函数将它们转换为数字

String numStr = "02";

if(numStr.startsWith("0")) {
    int num = getNumericValue(numStr.charAt(1));
} else {
    int num = Integer.parseInt(numStr);
}

现在我有很多未知数的数字(所以可能超过 2 个)。我知道,如果我愿意,我可以使用循环和.substring(),但必须有更简单的方法。

有什么办法可以简单地忽略零?

编辑:

直到现在,我总是将必须处理的数字编辑为字符串,因为我找不到更简单的方法来解决问题。当我有 0010 27 09 时,我必须声明它为:
String[] numbers = {"0010", "27", "09"};
因为如果我这样声明:
int[] numbers = {0010, 27, 09};
numbers[0] 将是 8 而不是 10, numbers[2] 会给我一个错误

实际上我不想使用字符串。我真正想要的是读取以零开头的数字作为数字(例如:int 或 long),但我希望它们是十进制的。问题是我有很多来源。我将它们复制到代码中并将其编辑为数组的声明。但我不想将它们编辑为字符串,只是为了删除零并再次使它们成为数字。

【问题讨论】:

  • "numStr".charAt(1)'u'。而Integer.parseInt("numStr") 将失败并返回NumberFormatException,因为"numStr" 不是数字。
  • 您能否发布预期/示例输入和输出?
  • 可能跑题了,但是你在双引号中使用了你的字符串变量。它应该只是 numStr 而不是“numStr”。在解析和获取字符时。
  • Integer.parseInt("010") 将返回一个int,其值为10。除非您明确指定基数,否则十进制是您的 String 将被解析的默认系统。
  • Java 仅将数字视为以 0 开头的八进制数,而实际上它们与源代码中的数字相同。 Java 确实将用户输入您的程序(例如,通过程序的 GUI)的数字视为八进制,因此在这种情况下您不需要做任何技巧。 Integer.parseInt(...) 不将 0 开头的数字视为八进制!

标签: java string decimal octal


【解决方案1】:

我不太确定你想要实现什么。您是否希望能够以8-based 格式读取Integer,以String 给出(案例1)?还是您想阅读这样的String 并将其解释为10-based,尽管它是8-based(案例2)? 或者您只是想知道如何在不手动转换的情况下创建这样的Integer(案例3)?

案例一:

String input = "0235";
// Cut the indicator 0
input = input.substring(1);

// Interpret the string as 8-based integer.
Integer number = Integer.parseInt(input, 8);

案例 2:

String input = "0235";
// Cut the indicator 0
input = input.substring(1);

// Interpret the string as 10-based integer (default).
Integer number = Integer.parseInt(input);

案例 3:

// Java interprets this as octal number
int octal = 0235;
// Java interprets this as hexadecimal number
int hexa = 0x235
// Java interprets this as decimal number
int decimal = 235

您可以通过对指标做出反应将Case 1 扩展为一种智能方法:

public Integer convert(final String input) {
    String hexaIndicator = input.substring(0, 2);

    if (hexaIndicator.equals("0x")) {
        return Integer.parseInt(input.substring(2), 16);
    } else {
        String octaIndicator = input.substring(0, 1);

        if (octaIndicator.equals("0")) {
            return Integer.parseInt(input.substring(1), 8);
        } else {
            return Integer.parseInt(input);
        }
    }
}

【讨论】:

  • 抱歉这个问题的措辞不佳/糟糕。我尝试指定它,希望现在可以了 这不是我想知道的,但它包含我不知道的东西,非常感谢。
  • 啊,您的输入 (Strings) 都应该被视为十进制数,但它们可以有任意多个 前导 零,应该被忽略,因为 Integer.parseInt(input)对他们失败?所以你想删除给定String 的所有前导零?您可以使用正则表达式 Regex 简单地做到这一点。来自String 的方法replaceAll 接受这样的Regex。请尝试以下操作:input = input.replaceAll("^0*", "");,它将所有出现的前导零替换为空的String。你可以在这里试试:https://regex101.com/r/oW4oM6/1
猜你喜欢
  • 2017-02-19
  • 1970-01-01
  • 2011-05-06
  • 2021-03-25
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
相关资源
最近更新 更多