将一些十六进制字符串转换为十进制整数

27

我写了一些代码将我的十六进制显示字符串转换为十进制整数。但是,当输入像100a625b(带有字母的字符串)时,我会收到以下错误:

java.lang.NumberFormatException:对于输入字符串:“ 100a”,在 java.lang.NumberFormatException.forInputString(Unknown Source)中 在 java.lang.Integer.parseInt(Unknown Source)

如何将带字母的字符串转换为十进制整数?

if(display.getText() != null)
{
    if(display.getText().contains("a") || display.getText().contains("b") ||
       display.getText().contains("c") || display.getText().contains("d") ||
       display.getText().contains("e") || display.getText().contains("f"))
    {
        temp1 = Integer.parseInt(display.getText(), 16);
        temp1 = (double) temp1;
    }
    else
    {
        temp1 = Double.parseDouble(String.valueOf(display.getText()));
    }
}

不要忘记十六进制是大小写不敏感的,所以你也应该检查大写字母A-F。 - stevevls
5
仅仅因为包含十六进制数字中的字母"a"到"f",就得出一个数是十六进制的结论是危险的。事实上,一个十六进制的值完全可以不含这些数字中的任何一个。 - scottb
13个回答

59

看起来您的字符串(" 100a")前面有一个多余的(领先的)空格字符。您可以使用trim()去除前导和尾随的空格:

temp1 = Integer.parseInt(display.getText().trim(), 16);

或者如果您认为空格的存在意味着还有其他问题,您将不得不自己调查,因为我们没有您代码的其余部分。


好发现!我从来没有注意到那个。 - Kevin Bowersox

17
public static int hex2decimal(String s) {
    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;
    }
    return val;
}

那是我在互联网上找到的最高效和优雅的解决方案 。这里提供的其他一些解决方案对我并不总是有效。


1
对我不起作用。我尝试将字符串数字0a470c00025f424a传递给它。甚至我尝试返回 long 而不是 int - Joaquin Iurchuk
1
在 for 循环中,只需循环遍历 s.toCharArray() 中的每个字符。我检查过,这样更快。 - NonameSL
@PeterMortensen 现在不可能记得了,已经过去7年了 :) 我想有些输入并没有总是得到预期的输出。 - AlexAndro

4
//package com.javatutorialhq.tutorial;

import java.util.Scanner;

/* Java code to convert hexadecimal to decimal */
public class HexToDecimal {

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        System.out.print("Hexadecimal Input: ");

        // Read the hexadecimal input from the console

        Scanner s = new Scanner(System.in);

        String inputHex = s.nextLine();

        try {
            // Actual conversion of hexadecimal to decimal

            Integer outputDecimal = Integer.parseInt(inputHex, 16);

            System.out.println("Decimal Equivalent: " + outputDecimal);
        }

        catch(NumberFormatException ne) {

            // Printing a warning message if the input
            // is not a valid hexadecimal number

            System.out.println("Invalid Input");
        }

        finally {
            s.close();
        }
    }
}

3

我的方式:

private static int hexToDec(String hex) {
    return Integer.parseInt(hex, 16);
}

0
void htod(String hexadecimal)
{
    int h = hexadecimal.length() - 1;
    int d = 0;
    int n = 0;

    for(int i = 0; i<hexadecimal.length(); i++)
    {
        char ch = hexadecimal.charAt(i);
        boolean flag = false;
        switch(ch)
        {
            case '1': n = 1; break;
            case '2': n = 2; break;
            case '3': n = 3; break;
            case '4': n = 4; break;
            case '5': n = 5; break;
            case '6': n = 6; break;
            case '7': n = 7; break;
            case '8': n = 8; break;
            case '9': n = 9; break;
            case 'A': n = 10; break;
            case 'B': n = 11; break;
            case 'C': n = 12; break;
            case 'D': n = 13; break;
            case 'E': n = 14; break;
            case 'F': n = 15; break;
            default : flag = true;
        }
        if(flag)
        {
            System.out.println("Wrong Entry"); 
            break;
        }
        d = (int)(n*(Math.pow(16,h))) + (int)d;
        h--;
    }
    System.out.println("The decimal form of hexadecimal number "+hexadecimal+" is " + d);
}

0
您可以使用此方法获取数字:
public int digitToValue(char c) {
   (c >= '&' && c <= '9') return c - '0';
   else if (c >= 'A' && c <= 'F') return 10 + c - 'A';
   else if (c >= 'a' && c <= 'f') return 10 + c - 'a';
   return -1;
 }

0

由于没有暴力方法(手动完成)来知道发生了什么。

给定一个十六进制数

KₙKₙ₋₁Kₙ₋₂....K₂K₁K₀

等价的十进制值为:

Kₙ * 16ₙ + Kₙ₋₁ * 16ₙ₋₁ + Kₙ₋₂ * 16ₙ₋₂ + .... + K₂ * 16₂ + K₁ * 16₁ + K₀ * 16₀

例如,十六进制数AB8C是:

10 * 16₃ + 11 * 16₂ + 8 * 16₁ + 12 * 16₀ = 43916

实现:

 //convert hex to decimal number
private static int hexToDecimal(String hex) {
    int decimalValue = 0;
    for (int i = 0; i < hex.length(); i++) {
        char hexChar = hex.charAt(i);
        decimalValue = decimalValue * 16 + hexCharToDecimal(hexChar);
    }
    return decimalValue;
}
private static int hexCharToDecimal(char character) {
    if (character >= 'A' && character <= 'F')
        return 10 + character - 'A';
    else //character is '0', '1',....,'9'
        return character - '0';
}

0
你可以利用每个字母的ASCII值并减去55,这样做简单快捷。
int asciiOffset = 55;
char hex = Character.toUpperCase('A');  // Only A-F uppercase
int val = hex - asciiOffset;
System.out.println("hexadecimal:" + hex);
System.out.println("decimal:" + val);

输出:
十六进制:A
十进制:10


1
请提供一些解释。 - Sunil Garg

0

这是我的解决方案:

public static int hex2decimal(String s) {
    int val = 0;
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        int num = (int) c;
        val = 256*val + num;
    }
    return val;
}

例如将3E8转换为1000:
StringBuffer sb = new StringBuffer();
sb.append((char) 0x03);
sb.append((char) 0xE8);
int n = hex2decimal(sb.toString());
System.out.println(n); //will print 1000.

0
一个更简单的方法是使用BigInteger,像这样:
BigInteger("625b", 16)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接