【问题标题】:How to make this code not print negative values?如何使此代码不打印负值?
【发布时间】:2019-12-08 19:13:44
【问题描述】:

编写代码是为了将十六进制值转换为十进制,但是当我输入无效数字(例如“S”)时,它会打印出一个负值。

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    String s = "a1";

    String digits = "0123456789ABCDEF";
    s = s.toUpperCase();
    int val = 0;

    for (int i = 0; i < s.length(); i++)
    {
        char c = s.charAt(i);
        int d = digits.indexOf(c);
        val = 16*val + d;
    }

System.out.println("等效的十进制数为"+val);

【问题讨论】:

  • 因为如果您的数字变量中不存在该字符,则 indexOf(c) 返回 -1
  • @billalGHILAS 我该如何更改它?请帮忙
  • if (d==-1) {则以不同的方式进行..}

标签: java hex


【解决方案1】:

你有2个选择,添加一个条件

for (int i = 0; i < s.length(); i++)
{
    char c = s.charAt(i);
    int d = digits.indexOf(c);
    if (d == -1) {
        val = -1;
        break;
    }
    val = 16*val + d;
}

if (val == -1) {
    System.out.println("Invalid number");
} else {
    System.out.println(val);
}

或者像这样使用java内置转换器

public static void main(String[] args) {
    // TODO Auto-generated method stub
    String s = "a1";
    try {
        int val = Integer.parseInt(s, 16);
        System.out.println(val);
    } catch(NumberFormatException ex) {
        System.out.println("Invalid number");
    }  
}      

【讨论】:

    【解决方案2】:

    如果您的输入不是十六进制数,您可以抛出异常,如下所示:

    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        int d = digits.indexOf(c);
        if (d == -1) {
            throw new NumberFormatException("Your input is not an hexadecimal number");
        }
        val = 16 * val + d;
    }
    

    编辑: 更好的选择,因此如果您的输入不是十六进制,则 for 循环根本不会迭代。只需将它放在你的 for 循环之前,它就会发现你的输入是否包含一个不在你的 digits 字符串中的字符,并在这种情况下抛出异常:

    if (!s.matches("[" + digits + "]+")) {
        throw new NumberFormatException("Your input is not an hexadecimal number");
    }
    

    【讨论】:

      猜你喜欢
      • 2017-12-01
      • 2016-05-02
      • 2017-02-28
      • 1970-01-01
      • 1970-01-01
      • 2022-08-17
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      相关资源
      最近更新 更多