我想 return 一个格式化的 Phone 使用子字符串但奇怪的数字 return

I want to return a formatted Phone Number with use substring but odd thing return

我是 java 的新手。为什么这不起作用?? 这必须得到这样的东西 formatPhoneNumber([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]) 然后 return (123) 456-7890

感谢您的回答。

public class Program {                                                                             
    public static String formatPhoneNumber(int[] nums) {                                               
        String nums2=nums.toString();
        String a_final ="";
        //"(123) 456-7890"
        a_final="\""+("+nums2.substring(0,2)+")"+"\t"+nums2.substring(3,5)+"-"+nums2.substring(6,9)+"\"";
        return a_final; 
                                                                                                 
    }
}

String nums2=nums.toString();

并不像您认为的那样。通过使用 System.out.println 打印结果来检查结果 让它做你认为它做的事情的快速方法是 String nums2=java.util.Arrays.toString(nums).replaceAll("\D", "");

使用toString()时;原始类型数组中的方法 结果是内存中的位置 e.x "[I@1b28cdfa"

如果您想将数字数组复制到字符串中,只需使用 StringBuilder

StringBuilder builder = new StringBuilder();

    for (int number : nums){

        builder.append(number);

    }

    String nums2 = builder.toString();

    
    String a_final="("+nums2.substring(0,3)+")"+nums2.substring(3,6)+"-"+nums2.substring(6,9);


    System.out.println(a_final);

toString 方法 int[] returns:

getClass().getName() + "@" + Integer.toHexString(hashCode());

因此,您不会将所有数字简单地附加为字符串。要获得 nums2 字符串,您只需将 nums 元素一一附加为:

String nums2 = "";
for (int e : nums)
    nums2 += e;

最终结果字符串为:

a_final="\""+"("+nums2.substring(0,3)+")"+"\t"+nums2.substring(3,6)+"-"+nums2.substring(6,9)+"\"";

请注意您的 a_final 不正确,因为它缺少一些字符。我在上面修改过。

您可以使用 MaskFormatter

import javax.swing.text.MaskFormatter;
//...
public static String formatPhoneNumber(int[] nums) throws ParseException {
    StringBuilder sb=new StringBuilder();
    for(int value:nums){
        sb.append(value);
    }
    String phoneMask= "(###)-###-####";
    MaskFormatter maskFormatter= new MaskFormatter(phoneMask);
    maskFormatter.setValueContainsLiteralCharacters(false);
    return maskFormatter.valueToString(sb.toString()) ;
}

这是使用 stream API.
int 数组转换为 String 的替代方法 (代码后的注释。)

import java.util.Arrays;
import java.util.stream.Collectors;

public class Program {
    public static String formatPhoneNumber(int[] nums) {
        String nums2 = Arrays.stream(nums)
                             .mapToObj(i -> String.valueOf(i))
                             .collect(Collectors.joining());
        String aFinal = String.format("\"(%s)\t%s-%s\"",
                                      nums2.substring(0, 3),
                                      nums2.substring(3, 6),
                                      nums2.substring(6));
        return aFinal;
    }

    public static void main(String[] args) {
        System.out.println(formatPhoneNumber(new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}));
    }
}

由于final不能作为变量名,所以改成了a_final。我认为您应该尝试遵守 java naming conventions,因此我将变量名称更改为 aFinal。使用约定可以让其他人更容易阅读和理解您的代码,这有助于当您希望人们帮助您解决代码中的问题时。

此外,您在调用 substring 时使用的索引与您的预期输出不匹配(如您的问题中所述)。在上面的代码中,我也更正了这些。

这是我 运行 上述代码时得到的输出。

"(123)  456-7890"