将大型机签名字符转换为 Java 中相应整数值的最佳方法是什么

What is the best way to convert mainframe signed characters to corresponding integer values in Java

我有一个场景,其中像下面这样的字符将出现在固定长度的文件中

{ABCDEFGHI = 这组字符分别代表正数0123456789

}JKLMNOPQR = 这组字符分别代表负数0123456789

我需要使用java将它们转换成相应的数字0123456789(正负)。 例如:

45{ 应转换为 450(因为 '{' 表示正数 '0' )

45A 应转换为 451(因为 'A' 表示正 '1' )

45B 应转换为 452(因为 'A' 表示正 '2' )

45} 应转换为 -450(因为 '}' 表示负 '0' )

45J 应转换为 -451(因为 'J' 表示负数 '1' )

45K 应转换为 -452(因为 'K' 表示负数 '2')

我在 java 方面不太擅长所以我使用下面的代码首先使用替换函数将包含上述字符的字符串替换为相应的数字。我知道必须有更好的方法来做 that.Can 请在 this.Many 上给我建议 在此先感谢。

public static String replaceChar(String str) {
        if (str.contains("{")) {
            str =  str.replace("{", "0");
        }   
        if (str.contains("A")) {
            str =  str.replace("A", "1");
        }
        if (str.contains("B")) {
            str =  str.replace("B", "2");
        }
        if (str.contains("C")) {
            str =  str.replace("C", "3");
        }
        if (str.contains("D")) {
            str =  str.replace("D", "4");
        }
        if (str.contains("E")) {
            str =  str.replace("E", "5");
        }
        if (str.contains("F")) {
            str =  str.replace("F", "6");
        }
        if (str.contains("G")) {
            str =  str.replace("G", "7");
        }
        if (str.contains("H")) {
            str =  str.replace("H", "8");
        }
        if (str.contains("I")) {
            str =  str.replace("I", "9");
        }
        if (str.contains("J")) {
            str =  str.replace("J", "1");
        }
        return str;
    }

我们可以尝试遍历字符串,然后使用模数计算数值:

String input = "ABCDEFGHIJKLMNOPQR";
StringBuilder sb = new StringBuilder();

for (int i=0; i < input.length(); ++i) {
    sb.append(String.valueOf((input.charAt(i) - 'A') % 10));
}

System.out.println(input);
System.out.println(sb.toString());

ABCDEFGHIJKLMNOPQR
012345678901234567

我的输出确实与你的问题完全一致,但你的问题似乎在字符串中有一些拼写错误。

您可以将字母表映射到数字,正如@Tim 已经展示的那样,使用字母作为键,数字作为值,使用正则表达式检查否定性,最后用映射值替换输入字符串中包含的映射键:

public static void main(String[] args) throws IOException {
    System.out.println(convert("45{"));
    System.out.println(convert("45A"));
    System.out.println(convert("45B"));
    System.out.println(convert("45}"));
    System.out.println(convert("45J"));
    System.out.println(convert("45K"));
}
public static long convert(String str){
    String alphabet = "{ABCDEFGHI}JKLMNOPQR";
    Map<String,String> map = Pattern.compile("")
                              .splitAsStream(alphabet)
                              .collect(Collectors.toMap(k->k, k->String.valueOf(alphabet.indexOf(k)%10)));
    boolean isNegative = false;
    if(Pattern.compile("[J-R\}]+").matcher(str).find()){
        isNegative = true;
    }
    for(String letter : alphabet.split("")){
        str = str.replace(letter, map.get(letter));
    }
    long result = Long.parseLong(str);
    return isNegative ? - result: result;
}