从char获取ASCII不起作用?

时间:2016-03-24 07:55:24

标签: java ascii

我正在创建一个遵循以下格式的票务系统:

  

编写一个名为Ticket.java的Java程序,提示(询问)用户   输入票号。有效票证的格式是CCCDD [C] [C]   其中D =数字,C =字符,[C]表示字符   在这个位置是可选的。一开始的三个字符可能是   任何字符(字母)。如果只有一个可选字符   票证字符串的结尾,那个字符可能只是' S'要么   ' M'如果票证末尾有两个可选字符   字符串,那么字符只能是' S'和' M'按此顺序。

示例输入是LMN25S

现在要获得价格我必须将前三个字符格式化为ASCII,将它们加在一起并比较下面的规则。

  

如果前三个字符是"小于" JKL,基本价格是   50美元,如果前三个字符是"大于或等于" JKL   和"小于" TAF,基本价格是100美元,否则基本价格是   $ 150

问题是,问题指南(上述)规定,如果项目小于TAF但等于或大于JKL,则价格必须为100 $。但这些项目等于以下内容:

    char j = 'J';char k = 'K';char l = 'L';
    int JKL = (int)j + (int)k + (int)l;
    char t = 'T';char a = 'A';char f = 'F';
    int TAF = (int)t + (int)a + (int)f;
    Print("JKL:" + JKL + "\nTAF:" + TAF);

打印JKL:225,TAF:219因此使规则为空,因为根据如何转换,TAF更小。

以下是我更好理解的完整代码

    import java.util.Scanner;

public class Ticket {
    public static void main(String[] args) {
        Print("Please enter a ticket number:");
        String ticket = getInput();
        if(countValid(ticket) && checkCharacters(ticket) && checkDigits(ticket) && checkLastCharacter(ticket)) {
            Print("Valid!");
            Print("Ticket pricing is " + PrintPrice(ticket));
        }
    }

    public static double PrintPrice(String input) {
        int first = (int)input.charAt(0);
        Print("" + first);
        int second = (int)input.charAt(1);
        Print("" + second);
        int third = (int)input.charAt(2);
        Print("" + third);
        double price = 0;
        Print("Total:" + (first+second+third) + "");
        //225
        char j = 'J';char k = 'K';char l = 'L';
        int JKL = (int)j + (int)k + (int)l;
        char t = 'T';char a = 'A';char f = 'F';
        int TAF = (int)t + (int)a + (int)f;
        Print("JKL:" + JKL + "\nTAF" + TAF);

        char one = input.charAt(0);
        char two = input.charAt(1);
        char three = input.charAt(2);

        int value = (int)one + (int)two + (int)three;
        Print("next total:" + value);
        if(value < JKL) {
            price += 50;
        }else if(value >= JKL && value < TAF) {
            price += 100;
        }else{
            price += 150;
        }
        String discountString = "" + Character.getNumericValue(input.charAt(3)) + Character.getNumericValue(input.charAt(4));
        Print(discountString);
        if(input.length() > 5) {
            if(input.charAt(5) == 'S') {
                price+= 17.45;
            }else if(input.charAt(5) == 'M') {
                price+=29.70;
            }
        }else if(input.length() > 6) {
            //price+=41.25;
        }

        double discount = Double.parseDouble(discountString);
        Print((price * (discount/100)) + "");
        //price = price - (price * (discount/100));
        //price = price * factor;
        return price;
    }


    public static boolean checkLastCharacter(String input) {
        boolean success = false;
        int successCount = 0;
        if(input.length() == 5) {
            success = true;
        }else{
            if(input.length() == 6) {
                char temp = input.charAt(5);
                if(temp == 'S' || temp == 'M') {
                    success = true;
                }else{
                    success = false;
                    Print("Failed due to character not matching 'S' or 'M', '" + temp + "' is invalid");
                }
            }else if(input.length() == 7) {
                char temp = input.charAt(5);
                char temp1 = input.charAt(6);
                if(temp == 'S' && temp1 == 'M') {
                    success = true;
                }else{
                    success = false;
                    Print("Failed due to characters not matching 'SM', '" + temp + temp1 + "' is invalid");
                }
            }else{
                Print("Input characters overloaded! Only accepts up to 7 inputs");
            }
        }
        return success;
    }

    public static boolean countValid(String input) {
        boolean success = false;
        if(input.length() < 9 && input.length() > 4) {
            success = true;
        }else{
            Print("The count is invalid, only numbers between 5 and 7 are accepted!");
        }
        return success;
    }

    public static boolean checkCharacters(String input) {
        boolean success = false;
        int successCount = 0;
        for(int i = 1; i < 3; i++) {
            char temp = input.charAt(i);
            if(Character.isLetter(temp)) {
                successCount++;
            }
        }
        if(successCount == 2) {
            success = true;
        }else{
            Print("First three characters must be letters!");
        }
        return success;
    }

    public static boolean checkDigits(String input) {
        boolean success = false;
        int successCount = 0;
        for(int i = 3; i < 5; i++) {
            char temp = input.charAt(i);
            if(Character.isDigit(temp)) {
                successCount++;
            }
        }
        if(successCount == 2) {
            success = true;
        }else{
            Print("The inputs after 3 letters must be 2 digits!");
        }
        return success;
    }

    //Easier way to print to system.out
    public static void Print(String input) {
        System.out.println(input);
    }

    //Gets the input from a scanner
    public static String getInput() {
        Scanner sc = new Scanner(System.in);
        return sc.nextLine();
    }
}

请忽略所有各种打印件,仅用于测试目的。我的转换是正确的还是问题规则是正确的,我错过了转换/错过格式

编辑:下面的完整问题声明以获取帮助:

  

用户可以输入任意长度的票证字符串。有效长度   根据上述条件,票价在5到7之间。任何   不在此长度范围内的故障单自动无效。一个   由于任何原因无效的票证将导致消息   显示在屏幕上说票证无效,没有   处理将使用该票证完成。这包括不显示   任何费用。应该尽一切努力给出确切原因   票无效。例如,错误的长度,以无效开头   字符,或以无效字符结尾。这些不是唯一的   票证无效的原因,部分任务是列出所有票据   使票证无效的条件并编写代码来覆盖这些条件   案例。检查用户输入的长度后,您的程序需要   检查字符串中的前三个字符是否确实存在   字母(&#39; A&#39; - &#39; Z&#39;和/或&#39; a&#39; - &#39; z&#39;,用户输入必须是大小写   不区分大小写)。如果前三个字符中的任何一个不是字母,   然后在屏幕上显示相应的错误消息   程序结束。清除此检查后,您的程序必须   检查String中接下来的2个字符是否确实是数字   (0-9之间)。再次,如果没有2位数,那么程序   显示相应的错误消息并关闭。提示:考虑一下   当我们在键盘输入0时,我们正在输入字符&#39; 0&#39; 0   它的ASCII / Unicode为48.所以我们真正存储的是   base 10 number 48.我们需要将它从字符0转换为整数   0. 1实际上是字符&#39; 1&#39;使用ASCII / Unicode v   49号等等。 f票证有效,然后是票证的费用   计算并显示在屏幕上。如果前三个   字符小于&#34;小于&#34; JKL,基本价格是50美元,如果是第一个   三个字符大于或等于&#34; JKL和&#34;小于&#34;   TAF,基本价格是100美元,否则基本价格是150美元2位数   必须将字符转换为基数10整数。这是   折扣适用于机票的最终费用。如果2   例如,数字是25,那么这将被转换为   基地10号二十五号。这意味着有25%   最终票价折扣,最终含义后我们有   处理了&#39; S&#39;和/或&#39; M&#39;可选字符,如果它们存在。   角色&#39; M&#39;在票证字符串的末尾,如果它是唯一的   可选字符为票证的成本增加29.70美元。该   人物&#39; S&#39;在票证字符串的末尾,如果它是唯一的   可选字符增加了票价的17.45美元。该   人物&#39; S&#39;和&#39; M&#39;,按顺序,如果有可选项   票证末尾的字符增加了41.25美元的费用   门票。

5 个答案:

答案 0 :(得分:2)

也许他们在谈论词典顺序,而不是char的总和?

然后JFK不如TAF,PAM = 100 $。

在这种情况下,您只需要比较字符串: (感谢@Serge Ballesta的回答)

// to upperCase is a safety to match the case insensitiv requirement
String priceString = input.substring(0, 3).toUpperCase();
double price;
if (priceString.compareTo("JKL") < 0){
    price = 50.;
}
else if (priceString.compareTo("TAF") < 0){
    price = 100.;
}
else{
    price = 150.;
}

不要忘记折扣(数字)和最后两个字符。 祝你好运!

答案 1 :(得分:1)

完整的要求很明确,我很少在SO问题中看到这么好的规格。

要求您将2位数字转换为整数值,但在将其设为大写后,您应将字符串 CCC与"JKL""TAF"进行比较(用户输入必须不区分大小写

所以是的@Whitefret猜测是正确的。测试应该只是:

    String priceString = input.substring(0, 3).toUpperCase();
    double price;
    if (priceString.compareTo("JKL") < 0) {
        price = 50.;
    }
    else if (priceString.compareTo("TAF") < 0) {
        price = 100.;
    }
    else {
        price = 150.;
    }

你到底在哪里看到你被要求添加ascii值?

再次阅读折扣规格:必须将2位数字转换为10位整数。这是应用于票证最终成本的折扣。例如,如果2个数字是25,那么这将转换为基数为10的数字

所以我们只需要:

int discount = Integer.parseInt(input.substring(3, 5));

TL / DR:在编码之前,您必须阅读并理解您的要求

答案 2 :(得分:0)

这是一个简单的串联吗?

T = 84,A = 65,F = 70 - 所以TAF = 846,570
J = 74,k = 75,L = 76-所以JK​​L = 747,576

答案 3 :(得分:0)

您应该对规范的“小于”和“大于”位进行更精确的定义。我的猜测与@ Whitefret的相同,它可能是一个词典顺序,但你应该确保这一点。

答案 4 :(得分:-1)

因此,在做了一些研究之后,它看起来确实是词法秩序。 所以我得到了三个可能的变量并用Arrays.sort对它们进行了排序,然后选中了并检查了它。

 String[] array = new String[] {"JKL", "TAF", input.substring(0,3)};
        Arrays.sort(array);
        String result = array[1];
        if(result=="JKL") {
            price+=50;
        }else if(result=="TAF") {
            price+=150;
        }else{
            price+=100;
        }