当前位置: 首页 > 知识库问答 >
问题:

java.util.Formattable上的示例是否不正确?

卞嘉许
2023-03-14
import java.nio.CharBuffer;
import java.util.Formatter;
import java.util.Formattable;
import java.util.Locale;
import static java.util.FormattableFlags.*;

public class StockName implements Formattable {
    private String symbol, companyName, frenchCompanyName;
    public StockName(String symbol, String companyName,
                     String frenchCompanyName) {
        this.symbol = symbol;
        this.companyName = companyName;
        this.frenchCompanyName = frenchCompanyName;
    }

    public void formatTo(Formatter fmt, int f, int width, int precision) {
        StringBuilder sb = new StringBuilder();

        // decide form of name
        String name = companyName;
        if (fmt.locale().equals(Locale.FRANCE))
            name = frenchCompanyName;
        boolean alternate = (f & ALTERNATE) == ALTERNATE;
        boolean usesymbol = alternate || (precision != -1 && precision < 10);
        String out = (usesymbol ? symbol : name);

        // apply precision
        if (precision == -1 || out.length() < precision) {
            // write it all
            sb.append(out);
        } else {
            sb.append(out.substring(0, precision - 1)).append('*');
        }

        // apply width and justification
        int len = sb.length();
        if (len < width)
            for (int i = 0; i < width - len; i++)
                if ((f & LEFT_JUSTIFY) == LEFT_JUSTIFY)
                    sb.append(' ');
                else
                    sb.insert(0, ' ');

        fmt.format(sb.toString());
    }

    public String toString() {
        return String.format("%s - %s", symbol, companyName);
    }
}
System.out.printf("%s", new StockName("HUGE", "Huge Fruit, Inc.", "Fruit Titanesque, Inc."));
System.out.printf("%s", new StockName("PERC", "%Company, Inc.", "Fruit Titanesque, Inc."));
Exception in thread "main" java.util.MissingFormatArgumentException: Format specifier '%C'
        at java.util.Formatter.format(Formatter.java:2519)
        at java.util.Formatter.format(Formatter.java:2455)
        at StockName.formatTo(FormattableTest.java:44)
        at java.util.Formatter$FormatSpecifier.printString(Formatter.java:2879)
        at java.util.Formatter$FormatSpecifier.print(Formatter.java:2763)
        at java.util.Formatter.format(Formatter.java:2520)
        at java.io.PrintStream.format(PrintStream.java:970)
        at java.io.PrintStream.printf(PrintStream.java:871)
        at FormattableTest.main(FormattableTest.java:55)

为了澄清,在这种假设情况下,给stockname的参数是由用户控制的,可以是任意的;我对它们没有确切的控制权(我不能禁止输入%)。但是,我可以编辑stockname.formatto

共有1个答案

郑宇
2023-03-14

其实很简单。只能在格式化过程中转义百分比字符,而不能在原始属性中转义:

  // apply precision
  if (precision == -1 || out.length() < precision) {
    // write it all
    sb.append(out.replaceAll("%", "%%"));
  }
  else {
    sb.append(out.substring(0, precision - 1).replaceAll("%", "%%")).append('*');
  }

那么如果你这样做:

StockName stockName = new StockName("HUGE", "%Huge Fruit, Inc.", "Fruit Titanesque, Inc.");
System.out.printf("%s%n", stockName);
System.out.printf("%s%n", stockName.toString());
System.out.printf("%#s%n", stockName);
System.out.printf("%-10.8s%n", stockName);
System.out.printf("%.12s%n", stockName);
System.out.printf(Locale.FRANCE, "%25s%n", stockName);

输出如下所示:

%Huge Fruit, Inc.
HUGE - %Huge Fruit, Inc.
HUGE
HUGE      
%Huge Fruit*
   Fruit Titanesque, Inc.
 类似资料:
  • 本文向大家介绍Java正则判断日期格式是否正确的方法示例,包括了Java正则判断日期格式是否正确的方法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java正则判断日期格式是否正确的方法。分享给大家供大家参考,具体如下: 1、Java中用正则表达式判断日期格式是否正确 DateType.java: 2、运行结果 PS:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用: Ja

  • 我正在尝试使用Python语言解决这个初学者问题:https://www.codechef.com/problems/ZUBTRCNT 我已经编写了代码,在示例案例中给出了正确的输出。它给出与其他接受答案相同的输出。但我的代码没有被接受。 供参考:(我不接受的代码):https://www.codechef.com/viewsolution/40506063 (另一人成功回答):https://w

  • 因为我编码C已经超过20年了,我想我是时候参加一次测试了!看看我是不是学到了什么,或者我只是在网上给初学者发免费但不正确的建议。 这个网站(我不是附属)提供免费的C测试。https://www.tutorialspoint.com/cprogramming/cprogramming_mock_test.htm。

  • 简单表达式 正则表达式的最简单形式是在搜索字符串中匹配其本身的单个普通字符。例如,单字符模式,如 A,不论出现在搜索字符串中的何处,它总是匹配字母 A。下面是一些单字符正则表达式模式的示例: /a/ /7/ /M/ 可以将许多单字符组合起来以形成大的表达式。例如,以下正则表达式组合了单字符表达式:a、7 和 M。 /a7M/ 请注意,没有串联运算符。只须在一个字符后面键入另一个字符。 字符匹配

  • 本文向大家介绍html5-canvas “ context.drawImage”是否不在画布上显示图像?,包括了html5-canvas “ context.drawImage”是否不在画布上显示图像?的使用技巧和注意事项,需要的朋友参考一下 示例 使用尝试在画布上绘制图像对象之前,请确保已将其完全加载context.drawImage。否则,图像将无声显示。 在JavaScript中,图像不会立

  • 我只有6个月的Java经验(我也是新来的),所以如果我的代码看起来不完全正确,请原谅我。请注意,它仍然是一项正在进行中的工作。我试着写一个程序,接受字符串,只打印那些回文。 我应该: - 创建一个名为isPalindrome的方法,它有一个String参数,并且 - 根据字符串是否是回文返回一个布尔值。然后 - 修改主要方法以使用isPalindrome仅打印回文。 例如,如果我输入:“madam