Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何格式化前导为零的Java字符串?_Java_String_Formatting_Format - Fatal编程技术网

如何格式化前导为零的Java字符串?

如何格式化前导为零的Java字符串?,java,string,formatting,format,Java,String,Formatting,Format,以下是字符串,例如: "Apple" 我想加上0来填充8个字符: "000Apple" 我怎样才能做到 StringUtils.leftPad(yourString, 8, '0'); 这是我的 使用(或查看代码以创建自己的函数)。虽然不漂亮,但它可以工作。如果您可以访问apache commons,我建议您使用它 if (val.length() < 8) { for (int i = 0; i < val - 8; i++) { val = "0" + val

以下是字符串,例如:

"Apple"
我想加上0来填充8个字符:

"000Apple"
我怎样才能做到

 StringUtils.leftPad(yourString, 8, '0');

这是我的

使用(或查看代码以创建自己的函数)。

虽然不漂亮,但它可以工作。如果您可以访问apache commons,我建议您使用它

if (val.length() < 8) {
  for (int i = 0; i < val - 8; i++) {
    val = "0" + val;
  }
}
if(val.length()<8){
对于(int i=0;i
如果您必须在没有库的帮助下执行此操作:

("00000000" + "Apple").substring("Apple".length())

(只要字符串长度不超过8个字符,就可以正常工作。)

您可能需要处理edgecase。这是一种通用方法

public class Test {
    public static void main(String[] args){
        System.out.println(padCharacter("0",8,"hello"));
    }
    public static String padCharacter(String c, int num, String str){
        for(int i=0;i<=num-str.length()+1;i++){str = c+str;}
        return str;
    }
}
公共类测试{
公共静态void main(字符串[]args){
System.out.println(padCharacter(“0”,8,“hello”);
}
公共静态字符串padCharacter(字符串c、int num、字符串str){
对于(int i=0;i
String input=“Apple”;
StringBuffer buf=新的StringBuffer(输入);
while(buf.length()<8){
buf.插入(0,'0');
}
字符串输出=buf.toString();
公共静态void main(字符串[]args)
{
字符串stringForTest=“Apple”;
填充后的整数所需长度=8;
int inputStringLengh=stringForTest.length();
int diff=填充后所需的长度-inputStringLengh;
if(inputStringLengh
您可以使用另一个答案中使用的String.format方法生成0的字符串

String.format("%0"+length+"d",0)
可以通过动态调整格式字符串中前导0的数量来解决问题:

public String leadingZeros(String s, int length) {
     if (s.length() >= length) return s;
     else return String.format("%0" + (length-s.length()) + "d%s", 0, s);
}

这仍然是一个混乱的解决方案,但它的优点是可以使用整型参数指定结果字符串的总长度。

这很快&适用于任何长度

public static String prefixZeros(String value, int len) {
    char[] t = new char[len];
    int l = value.length();
    int k = len-l;
    for(int i=0;i<k;i++) { t[i]='0'; }
    value.getChars(0, l, t, k);
    return new String(t);
}
公共静态字符串前缀零(字符串值,int len){
char[]t=新字符[len];
int l=value.length();
int k=len-l;

对于(int i=0;i这是他真正想要的,我相信:

String.format("%0"+ (8 - "Apple".length() )+"d%s",0 ,"Apple"); 
输出:

000Apple
当字符串中的大多数字符都有8个字符时,速度会更快

int length = in.length();
return length == 8 ? in : ("00000000" + in).substring(length);
在我的情况下,在我的机器上要快1/8。

您可以使用:

org.apache.commons.lang.StringUtils.leftPad("Apple", 8, "0")
使用Guava的实用程序类:

Strings.padStart("Apple", 8, '0');

我也遇到过类似的情况,我使用了这个;它非常简洁,您不必处理长度或其他库

String str = String.format("%8s","Apple");
str = str.replace(' ','0');

简单而整洁。字符串格式返回
“Apple”
,因此在用零替换空格后,它会给出所需的结果。

以下是我用于预填充字符串的简单API较少的“可读脚本”(简单、可读且可调)

while(str.length()
在Java中:

String zeroes="00000000";
String apple="apple";

String result=zeroes.substring(apple.length(),zeroes.length())+apple;
在Scala中:

"Apple".foldLeft("00000000"){(ac,e)=>ac.tail+e}

您还可以在Java 8中探索一种使用streams和reduce的方法(类似于我使用Scala的方法)。它与所有其他解决方案都有点不同,我特别喜欢它。

有人尝试过这种纯Java解决方案(没有SpringUtils):


不幸的是,只有当字符串中没有空格时,此解决方案才有效。

如果您想用纯Java编写程序,可以遵循以下方法,或者有许多字符串实用程序可以帮助您更好地使用更高级的功能

使用一个简单的静态方法,您可以实现如下所示

public static String addLeadingText(int length, String pad, String value) {
    String text = value;
    for (int x = 0; x < length - value.length(); x++) text = pad + text;
    return text;
}

输出将是带有方法String::repeat(Java 11)的解决方案

如果需要将8更改为另一个数字或将其参数化,您可以使用:

String.format("%08d", "Apple");

这似乎是最简单的方法,不需要任何外部库。

但我想在字符串之前添加前导零,而不是int。您可以在Java 1.4及以下版本中使用StringUtils或DecimalFormat。在这里检查@Variag use
%07s
而不是
%07d
,您将得到
FormatFlagsConversionIsmatch异常
。你可以试试。为什么不使用commons lang呢?它有很多有用的额外功能。即使你不能使用commons lang,你也可以轻松地从StringUtils复制源代码来创建自己的函数。这将是一个比所选答案更好的通用解决方案。如果这是库用于的唯一方法呢?根据也许添加的库比它所使用的应用程序还要大很多倍。我可以想象不在应用程序中添加公共库的原因。别误会:我同意,它包含非常有用的东西,但我理解,如果好处不是只需要编写一个(或几个)外部jar,就不愿意将应用程序塞满外部jar回答“为什么不使用commons lang?它有很多有用的额外功能。”用一个具体的例子提问。小米在其Android设备上提供了一个过时的commons lang版本。在你的应用程序中包含一个更新的版本会导致类加载器冲突,因此commons lang不能再用于任何Android项目。@Nachi,即使存在过时的StringUtils.leftPad,-1可能是因为这不是一个很好的示例le:您使用的是“幻数”并连接字符串,这应该用StringBuilder或StringBuffer来代替。这不是一个好的答案,因为
val-8
对于Java来说不是正确的逻辑,并且会导致编译错误,这非常聪明——但我花了大约30秒的时间才“理解”。我认为一个更可读的解决方案会更好。这是一个非常好的解决方案,当你在没有太多空间的东西上嵌入软件时,额外的库是不可选择的。谢谢!!这个版本速度太快了!我喜欢它。@Mathu老实说,这并不难理解。两个字符串是连接在一起的并从中提取前5个字符。没有魔力。在这种情况下(对于固定字符串Apple)不太合理,但很容易理解。
(“0000”+字符串)。子字符串(字符串.length())
更真实。这将
字符串
填充前导零。Sorr
while(str.length() < desired_length)
  str = '0'+str;
public static String lpad(String str, int requiredLength, char padChar) {
    if (str.length() > requiredLength) {
        return str;
    } else {
        return new String(new char[requiredLength - str.length()]).replace('\0', padChar) + str;
    }
}
String zeroes="00000000";
String apple="apple";

String result=zeroes.substring(apple.length(),zeroes.length())+apple;
"Apple".foldLeft("00000000"){(ac,e)=>ac.tail+e}
//decimal to hex string 1=> 01, 10=>0A,..
String.format("%1$2s", Integer.toString(1,16) ).replace(" ","0");
//reply to original question, string with leading zeros. 
//first generates a 10 char long string with leading spaces, and then spaces are
//replaced by a zero string. 
String.format("%1$10s", "mystring" ).replace(" ","0");
public static String addLeadingText(int length, String pad, String value) {
    String text = value;
    for (int x = 0; x < length - value.length(); x++) text = pad + text;
    return text;
}
addLeadingText(8, "0", "Apple");
String str = "Apple";
String formatted = "0".repeat(8 - str.length()) + str;
String.format("%08d", "Apple");