【问题标题】:Java adding "0" at the end of the numberJava在数字末尾添加“0”
【发布时间】:2018-12-22 14:23:56
【问题描述】:

所以我的问题是我必须计算 10^n 使得 n ~ 10^5。显然它不适合任何数据类型,因此我决定改用字符串。 最后,我确实在初学者书中找到了解决方案 https://beginnersbook.com/2014/07/java-right-padding-a-string-with-spaces-and-zeros/.

我不想要乘以 10 n 倍的 BigInteger 解决方案。

public class PadRightExample2 {
    public static void main(String[] argv) {
        System.out.println("#" + rightPadZeros("mystring", 10) + "@");
        System.out.println("#" + rightPadZeros("mystring", 15) + "@");
        System.out.println("#" + rightPadZeros("mystring", 20) + "@");
    }

    public static String rightPadZeros(String str, int num) {
        return String.format("%1$-" + num + "s", str).replace(' ', '0');
    }
}

输出:

#mystring00@
#mystring0000000@
#mystring000000000000@

谁能解释一下%1$- 是什么,s 是干什么用的?

【问题讨论】:

标签: java string formatting zero-padding


【解决方案1】:
  • %代表String的格式
  • 1$ 表示String.format(String format, Object... args) 的第一个附加参数args2$ 将是第二个,等等。
  • -是左对齐,结合number声明最终输出的长度,简单说一下。 java.util.Formatter的说明文档好一点:

    左对齐输出。空格('\u0020')将根据需要添加到转换值的末尾以填充字段的最小宽度。

  • s代表String参数类型

典型的例子是日志,你用%s解析参数,这实际上是一样的。使用美元字符和数字 %1$s 指定参数编号,-10 使最终输出长度为 10。

#mystring00@            // mystring00 has length 10
#mystring0000000@       // mystring0000000 has length 15
#mystring000000000000@  // #mystring000000000000 has length 20

大部分信息都可以在java.util.Formatter的文档中找到,该文档在String::format中使用。


您发现的 sn-p 可能有点令人困惑,因为即使没有 1$ 它也可以工作,因为参数是按顺序传递的。

尝试以下操作:String.format("%2$-" + num + "s", str, "test").replace(' ', '0');。结果将是

#test000000@
#test00000000000@
#test0000000000000000@

String.format("%1$-" + num + "s", str, "test").replace(' ', '0'); 会导致您的 sn-p 的原始结果。注意1$2$ 的区别。

【讨论】:

  • 您可能想要编辑它,说s 实际上是参数类型。对于没有正确理解的人来说,它会更简单。
  • @chromaerror:好的,谢谢……那更准确了。
  • 这里的第一个String参数是“String str”?
  • @SushantPradhan:是的,就是这样。
  • "$1表示第一个附加参数"你不是说1$吗?
【解决方案2】:

也许我没有正确理解这个问题,但你不能这样做:

public static String rightPadZeros(String str, int num) {
    String add = "";
    for(int i = 0; i < num;i++) add += "0";
    return str + add;
}

我不太明白为什么num=10 时你会想要两个零,但如果你想要,那就这样做:

public static String rightPadZeros(String str, int num) {
    String add = "";
    for(int i = 0; i < num - 8;i++) add += "0";
    return str + add;
}

编辑:显然这对性能不利,所以这可能会更好:

public static String rightPadZeros(String str, int num) {
    return str + new String(new char[num]).replace("\0", "0");
}

【讨论】:

  • my num~10^5 这样做超出了问题的时间限制。 :(
  • 如果您不想使用 for 循环,则可以使用return str + new String(new char[num]).replace("\0", "0");
  • String += 循环中的字符串,10000 次?对性能不利。
  • 是的,@SushantPradhan 也是这么说的。这就是我改进它的原因。
  • @PieterMantel 谢谢伙计!它比以前的解决方案更容易理解! XD
猜你喜欢
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多