String.format中的%s代表数字

Sim*_*son 20 java printf

%s如果不需要额外的格式,在格式化数字时是否有任何理由不使用格式说明符?

例如

int answer = 42;
String text = String.format("The answer is %s", answer);
Run Code Online (Sandbox Code Playgroud)

而不是更常见的:

int answer = 42;
String text = String.format("The answer is %d", answer);
Run Code Online (Sandbox Code Playgroud)

我问的原因是我想要做一些自动更改源代码,这将是不方便,要弄清楚是否该类型answerintString或别的东西,

Jon*_*eet 35

我希望在千位分隔符和其他特定于语言环境的选项方面存在潜在的差异.第一种方法是打算调用Integer.toString(这不是对语言环境敏感的)因为Integer没有实现Formattable.第二种是使用潜在的区域设置敏感的整数格式 - 它可以插入数千个分隔符,甚至可能使用不同的数字集等.

更仔细地查看文档,看起来如果没有特定的格式化标志就不会应用分组分隔符,但是:

数字定位算法

获得整数部分,小数部分和指数(适用于数据类型)的数字后,将应用以下转换:

  • 字符串中的每个数字字符d由相对于当前语言环境的零数字z计算的特定于语言环境的数字替换; 那是d - '0'+ z.

样本有所不同:

import java.util.Locale;

public class Test {
  public static void main(String[] args) {
    Locale.setDefault(new Locale("hi", "IN"));
    System.out.printf("String: %s; Number: %d\n", 1234, 1234);
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 尝试`String.format(新的Locale("hi","IN"),"%d",1234)`,它产生`1234`.`new Locale("th","TH","TH"),"%d",1234)`产生`1234`. (6认同)
  • 嗯...所以改变`"答案是"+回答``String.format("答案是%d",答案)`是行为的改变,但是把它改成`String.format("答案"是%s",回答)`不是吗? (2认同)
  • @SimonNickerson:是的,没错。当然,它是否会*实际* 改变行为取决于您的默认语言环境。 (2认同)
  • +1:有趣的答案.实际上,我已经无数次地将%d应用于非"数字"对象(包括BigDecimal)...通常在我正在尝试记录异常的日志语句中.希望有一个"尽力而为"的String.format可以解决这个问题. (2认同)