Java 如何用前导零填充负整数?

Java 如何用前导零填充负整数?,java,scala,Java,Scala,下面是我的方法目前在Scala中的定义方式,我一直在遵循 这似乎适用于正整数,我得到了预期的行为 assert(digitFormatter(0, 1) == "0") assert(digitFormatter(0, 2) == "00") assert(digitFormatter(1, 2) == "01") assert(digitFormatter(10, 2) == "10"

下面是我的方法目前在Scala中的定义方式,我一直在遵循

这似乎适用于正整数,我得到了预期的行为

    assert(digitFormatter(0, 1) == "0")
    assert(digitFormatter(0, 2) == "00")
    assert(digitFormatter(1, 2) == "01")
    assert(digitFormatter(10, 2) == "10")
然而,这似乎不适用于负数,这是我所期望的输出

    assert(
      digitFormatter(-1, 2) == "-01")

然而,我得到的结果只是
-1
。如何使用java std库在负数上填充前导零?

您错误地描述了String.format的作用。在代码中有
${numDigits}
,这表明您认为
d
前面的数字是位数

不,是字符数

换言之:

String.format("%05d", -12)
生成字符串
-0012
,因为您要求的字符串长度至少为5个字符,并且应用0填充以获得5个字符

如果您想要一种方法,例如将
-12
转换为
-00012
(6个字符,5个数字)并将+12转换为
00012
(5个字符,5个数字),则必须执行以下操作:

def digitFormatter(long: Long, numDigits: Int): String = {
    var numChars = numDigits + (if (long < 0) 1 else 0)
    String.format(s"%0${numChars}d", long)
}
def digitFormatter(long:long,numDigits:Int):字符串={
var numChars=numDigits+(如果(长<0)1,则为0)
String.format(s“%0${numChars}d”,长)
}

注:我不是scala程序员,我正在尝试使用三元运算符,但我认为您可以在scala中实现这一点。

您可以按如下方式实现:

String result = ((value < 0) ? "-" : "") + String.format("%05d", Math.abs(value)); 
String结果=((值<0)?“-”:”)+String.format(“%05d”,Math.abs(值));

不幸的是,没有可用的Java格式可以做到这一点:它们的格式是基于字符串的总宽度,而不是零的数量。最简单的方法是根据参数是否为负来改变填充的长度:

def digitFormatter(long: Long, numDigits: Int): String = {
  val padlength = if (long >= 0) numDigits else numDigits + 1
  String.format(s"%0${padlength}d", long)
}

String.format
不应在Scala上使用。你可以阅读阿尔文·亚历山大的文章

要使其在Scala中工作,您需要执行以下操作:

def digitFormatter(long: Long, numDigits: Int): String = {
  val padlength = if (long < 0) numDigits + 1 else numDigits
  s"%0${padlength}d".format(long)
}
def digitFormatter(long:long,numDigits:Int):字符串={
val paddlength=if(long<0)numDigits+1 else numDigits
s“%0${padlength}d”。格式(长)
}

您可以在Scala文档中找到。代码运行可以在.

@OhGodspides上找到,我认为这是“将变量替换和其他模板内容应用于此字符串”的scala ese,也是使${whatsit}工作的原因。这导致运行时异常>java.util.DuplicateFormatFlagsException:Flags='0'位于java.util.Formatter$Flags.parse(Formatter.java:4443)在java.util.Formatter$FormatSpecifier.flags(Formatter.java:2640)在java.util.Formatter$FormatSpecifier.(Formatter.java:2709)在java.util.Formatter.parse(Formatter.java:2560)在java.util.Formatter.Formatter.flags(Formatter.java:2501)在java.util.Formatter.Formatter.Formatter(Formatter.java:2455)在java.lang.String.format(String.java:2940)上我已将其更改为
String.format(s“%0${numChars+numDigits}d”,long)
,但仍然不起作用<代码>“-[]1”不等于“-[0]1”@Chris使用您的scala技能,并尝试理解答案。如果您要求至少5位数字,并在其中抛出-1,您当前的代码(没有这些更新)将打印
-0001
-您肯定可以从中找到答案。我已经用我认为scala的三元模式更新了答案。该错误表明我的原始代码片段导致“numChars”为0,可能是因为运算符优先级。您所需要的就是()。作为一般提示,使用scala时,编译器错误会令人难以置信地迟钝,因此在放弃之前,您需要花一点时间试图弄清楚发生了什么,因为否则scala不适合您。我不想说scala错误总是完美的,但错误来自Java运行时,不是来自scala编译器。为我编译:--修复了oneTo关闭的问题要解决2.12中的错误,请使用
String.format(s“%0${padlength}d”,Long.box(Long))
def digitFormatter(long: Long, numDigits: Int): String = {
  val padlength = if (long < 0) numDigits + 1 else numDigits
  s"%0${padlength}d".format(long)
}