【问题标题】:charAt() returning weird valuescharAt() 返回奇怪的值
【发布时间】:2021-07-11 20:11:33
【问题描述】:

我正在尝试制作将数字转换为单词的程序,但是当我使用 charAt(0) 获取索引 0 的值时,它返回给我奇怪的值

 import java.util.Scanner;

public class numToWord {
    public static   void main(String[] args) {

        String[] digit = {"Zero","One ","Two", "Three ","Four ","Five ","Six ", "Seven ", "Eight ", "Nine" };
        Scanner sc  = new Scanner(System.in);
        String strNum = sc.next(); //input 123
        int intnum = Integer.valueOf(strNum.charAt(0));
        System.out.println(intnum);
        System.out.println(digit[intnum]);
        //output 49

    }
}

示例输入 123 输出 49

Input Output:

【问题讨论】:

  • 到底有什么奇怪的?如果您输入字符串"5",它由一个字符'5' 组成,在大多数编码中它的代码点为53。
  • 为什么它返回的代码点应该是正确的?
  • 认为char应该包含什么?它包含一个字符的代码点(好吧,从技术上讲,它可能只是一个代理对,但这是一个例外,对于最常用的字符char = 代码点成立)。
  • 在打印出“不正确”的值后,程序将因数组索引越界而崩溃,因为数字数组中没有 54 个元素。 (哦,我直到现在才查看输出的链接图片 - 是的,它按预期崩溃了)。
  • char是java中的整数类型。

标签: java charat


【解决方案1】:

您当前正在读取输入的第一个字符的 ascii 值。此外,您的数字映射中有空格。您想要做的是解析每个数字并获取映射。类似的,

String[] digit = { "Zero", "One", "Two", "Three", "Four", 
        "Five", "Six", "Seven", "Eight", "Nine" };
Scanner sc  = new Scanner(System.in);
String strNum = sc.next();
for (int i = 0; i < strNum.length(); i++) {
    if (i != 0) {
        System.out.print(" ");
    }
    int v = Character.digit(strNum.charAt(i), 10); // strNum.charAt(i) - '0'
    System.out.print(digit[v]);
}
System.out.println();

【讨论】:

    【解决方案2】:

    valueOf() 用于字符串转换,不适用于 char 类型。

    如果您想使用 valueOf()char 值转换为 integer,它总是返回 ASCII value 的。使用 Character.getNumericValue() 来解决这个问题。

    import java.util.Scanner;
    public class numToWord{
        public static   void main(String[] args) {
            String[] digit = {"Zero","One ","Two", "Three ","Four ","Five ","Six ", "Seven ", "Eight ", "Nine" };
            Scanner sc  = new Scanner(System.in);
            String strNum = sc.next();
            //int intnum = Integer.valueOf(strNum.charAt(0));
            int intnum = Character.getNumericValue(strNum.charAt(0));
            System.out.println(intnum);
            System.out.println(digit[intnum]);
        }
    }
    

    【讨论】:

      【解决方案3】:

      看看什么是 ASCII。

      字符 '1' 映射到 ASCII 图表上的十进制值 49

      【讨论】:

        猜你喜欢
        • 2020-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-12
        • 2013-04-26
        • 2013-02-07
        • 2012-06-21
        • 2013-10-08
        相关资源
        最近更新 更多