`
xuanzhui
  • 浏览: 199558 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Java字符串格式化

    博客分类:
  • Java
阅读更多

1. String format

格式

The format specifiers for general, character, and numeric types have the following syntax:
   %[argument_index$][flags][width][.precision]conversion
 
The optional argument_index is a decimal integer indicating the position of the argument in the argument list. The first argument is referenced by "1$", the second by "2$", etc.

The optional flags is a set of characters that modify the output format. The set of valid flags depends on the conversion.

The optional width is a non-negative decimal integer indicating the minimum number of characters to be written to the output.

The optional precision is a non-negative decimal integer usually used to restrict the number of characters. The specific behavior depends on the conversion.

The required conversion is a character indicating how the argument should be formatted. The set of valid conversions for a given argument depends on the argument's data type.

 直接看代码

System.out.println(String.format("|%1$-10s|随便写点什么|%2$10s|再加一个数字|%3$10.2f|", "ha", "bd",66.6666));

 打印结果

|ha        |随便写点什么|        bd|再加一个数字|     66.67|

 说明:

%1$-10s :

%  表示后面是一段格式化表达式

1$ 表示占位符,需要用跟在后面的第一个参数替换,1和argument_index相对应

-    表示左对齐,和flags相对应

10 对应于width,代表最小应该占用的宽度,因为需要打印的字符串可能超过width

s   对应于conversion,此处表示打印字符串

 

对于

%3$10.2f:

2表示打印的float精度到小数点后2位

 

对于格式化表达式之外的字符,直接打印

 

2. 对于普通的打印可以通过如下的函数以添加空格方式对齐

public static String padRight(String s, int n) {
     return String.format("%1$-" + n + "s", s);  
}

public static String padLeft(String s, int n) {
    return String.format("%1$" + n + "s", s);  
}

 How can I pad a String in Java

这种方法对英文表现良好,但是对于中文打印非常不理想

 

3. 自定义

考虑一个打印机,英文字符的打印宽度为中文字符的一半;

这种现象和GBK的存储格式比较类似。

 

但是java内置的是Unicode,

首先需要判断中文和普通的ASCII字符,

看一下Unicode中常用中文的位置:

Block名称 开始码位 结束码位 字符数
CJK统一汉字 4E00 9FBB 20924

参见 Unicode、GB2312、GBK和GB18030中的汉字

 

那么对取出来的char ch,如果下面的条件成立,可以基本认定是普通的ASCII码

(ch & 0xFFFF00) == 0

 

现在需要打印出如下的效果


 

商品名最多占用十个汉字宽度,后面至少有一个ASCII空格;

后面数量占用三个汉字宽度,但最后至少有一个ASCII空格;

最后是金额。

 

这里主要考虑商品名超出九个汉字宽度的情况,首先需要知道从哪里截断

/**
 * @param s 待处理的字符串
 * @param lenOnByte 最长的ASCII字符宽度,一个汉字=2倍ASCII字符宽度
 * @return [0]=-1表示没有超出,否则表示截断的最后一个char的index;
 *         [1]存储了s的ASCII宽度
 */
int[] findBreakIdxBasedOnGBK(String s, int lenOnByte) {
    int res[] = {-1, 0};

    int lenCnt = 0;
    int i = 0;
    for (; i < s.length(); i++) {
        char ch = s.charAt(i);
        //gbk单字节可存储
        if ((ch & 0xFFFF00) == 0) {
            lenCnt += 1;
        } else {
            lenCnt += 2;
        }

        if (lenCnt >= lenOnByte) {
            break;
        }
    }

    //表明所有字符没有循环结束已经越界
    //由于可能是正好最后一个char到达临界点,所以要减1
    if (i < s.length() - 1) {
        res[0] = i;
    }

    res[1] = lenCnt;
    System.out.println("break point: " + res[0] + "  #  gbk len: " + res[1]);
    return res;
}

 然后添加空格

/**
 * 右边添加空格用于对齐
 * @param s 待处理的字符串
 * @param sLenOnByte s的ASCII字符宽度
 * @param limitOnByte 最长的ASCII字符宽度
 * @return 拼接完成的字符串
 */
String padStringRightBasedOnGBK(String s, int sLenOnByte, int limitOnByte) {
    StringBuilder sb = new StringBuilder();
    sb.append(s);

    //padding
    for (int i = 0; i < limitOnByte - sLenOnByte; i++) {
        sb.append(" ");
    }

    return sb.toString();
}

应用

List<String> formatGoodsList(List<GoodsItem> goodsItems) {
    List<String> printData = new ArrayList<>();

    StringBuilder sb1 = new StringBuilder();

    for (GoodsItem item : goodsItems) {
        String tmp = item.getGoodsName();

        int[] idxs = findBreakIdxBasedOnGBK(tmp, 18);

        if (idxs[0] == -1) {
        	//如果没有越界
            sb1.append(padStringRightBasedOnGBK(tmp, idxs[1], 20));
        } else {
        	//如果越界,截取
            sb1.append(padStringRightBasedOnGBK(tmp.substring(0, idxs[0] + 1),idxs[1],20));
        }
        sb1.append(padRight(item.getGoodsNum() + "", 6));
        sb1.append(item.getGoodsPrice());

        printData.add(sb1.toString());

        if (idxs[0] != -1)	//如果越界,剩下的部分
            printData.add(item.getGoodsName().substring(idxs[0] + 1));

        sb1.setLength(0);
    }

    return printData;
}

  

最后attach一个测试文件

  • 大小: 5.7 KB
分享到:
评论

相关推荐

    java字符串格式化String.format()

    ### Java字符串格式化String.format()详解 #### 一、引言 `String.format()` 方法是JDK 1.5引入的新特性,它提供了一种灵活且强大的方式来格式化字符串。这种方法类似于C语言中的`printf`函数,允许开发者通过指定...

    字符串格式化需求规格说明书

    1. **格式化字符串的基本语法**:在各种编程语言中,如Python的f-string、C++的printf、Java的String.format等,都有各自的字符串格式化方法。理解这些语法对于正确地构造和输出格式化的字符串至关重要。 2. **变量...

    json字符串格式化工具

    "json字符串格式化工具"是针对JSON数据进行美化和整理的工具,主要功能包括将紧凑的JSON字符串转换为易于阅读的格式,添加缩进、换行,以及高亮显示键值对等。这对于开发者调试API接口、查看JSON响应或者理解复杂...

    json字符串格式化工具JsonView

    json字符串格式化工具,不用安装,直接运行,美化json字符串,方便,快捷。json字符串格式化工具,不用安装,直接运行,美化json字符串,方便,快捷。json字符串格式化工具,不用安装,直接运行,美化json字符串,...

    格式化字符串格式化字符串格式化字符串

    在各种编程语言中,如Python、Java、C++等,都有相应的字符串格式化方法。 1. **Python的字符串格式化** Python提供了多种字符串格式化方式。早期的`%`操作符类似于C语言中的printf风格,例如: ```python name ...

    Java_格式化字符串 汇总

    Java中的字符串格式化功能是处理和展示数据时不可或缺的一部分,尤其在需要将各种数据类型转换为特定格式的字符串时显得尤为重要。本文将深入探讨Java中`String`类的`format()`方法,及其如何用于创建格式化的字符串...

    java 字符串 正则表达式 详细实例代码

    4. **日期和时间字符串格式化** - Java中的`java.util.Date`类和`java.text.SimpleDateFormat`类用于处理日期和时间。`SimpleDateFormat`允许我们自定义日期时间格式,如`"yyyy-MM-dd HH:mm:ss"`。 - 示例代码: ...

    Java字符串_日期_数字格式化输出

    #### 二、Java字符串格式化输出 在Java中,`System.out.println()` 是最常用的打印输出语句,但当需要进行复杂的格式化输出时,它就显得力不从心了。此时可以考虑使用 `java.text` 包中的类来实现更为灵活的格式化...

    Java字符串 日期 数字格式化输出-.doc

    Java 字符串日期数字格式化输出 Java 中的字符串日期数字格式化输出是一种常见的操作,特别是在数据输出和显示时。 Java 提供了多种方式来实现格式化输出,包括使用 NumberFormat、DecimalFormat 和 ...

    java验证字符串是否符合json格式

    在Java编程中,验证字符串是否符合JSON(JavaScript Object Notation)格式是一项常见的任务,尤其是在进行前后端数据交互时。JSON是一种轻量级的数据交换格式,它允许数据以键值对的形式存储,易于人阅读和编写,...

    java String 字符串格式化

    JDK1.5中,String类新增了一个很有用的静态方法,这些方法有助于开发人员对字符串的各类操作

    JAVA 字符串 操作

    在Java编程语言中,字符串...以上只是Java字符串操作的一小部分,实际开发中还有许多其他方法和特性,如国际化(I18N)、正则表达式等,都需要程序员灵活掌握。理解并熟练运用这些操作,能有效提高代码质量和效率。

    Java字符串长度不够前面或后面补0.txt

    ### Java字符串长度不够前面或后面补0 在Java编程中,有时我们需要确保字符串达到特定的长度,如果实际长度不足,则需要在字符串的前部或后部添加特定字符(如0)来填充,使得最终字符串满足预设长度的要求。本文将...

    Json字符串格式化工具

    HiJson工具免去了我们需要联网格式化json字符串的烦恼,无需百度搜索在线格式化,只要安装了JDK,打开就可以用。

    JAVA 字符串应用笔记

    在Java编程语言中,字符串是极其重要且常用的数据类型,尤其在Android开发中更是不可或缺。...在实际开发中,还会涉及到更多高级特性和实践技巧,如字符串格式化、正则表达式的复杂使用、字符串的安全问题等。

    JAVA日期与字符串的转换

    `SimpleDateFormat`是`java.text`包中的一个子类,它可以用来格式化和解析日期。下面是一个具体的例子: ```java import java.text.SimpleDateFormat; import java.util.Date; public class DateToStringConverter...

    Java字符串转换为日期和时间比较大小[归类].pdf

    在 Java 中,SimpleDateFormat 是一个格式化和解析日期的类。我们可以使用 SimpleDateFormat 将字符串转换为日期,然后比较日期的大小。 首先,我们需要创建一个 SimpleDateFormat 对象,并设置日期格式为 "yyyy-MM...

    java字符串的各种编码转换

    ### Java字符串的编码转换 在Java中,处理不同字符集之间的字符串转换是一项常见任务。尤其是在处理国际化应用时,理解并掌握各种字符编码格式变得尤为重要。下面将介绍几种常见的字符编码格式以及如何在Java中实现...

    java完美按格式化字符串String转sql.date

    ### Java完美按格式化字符串String转sql.Date 在Java编程中,经常需要处理日期与时间相关的数据。特别是在数据库操作时,经常会遇到需要将字符串类型的日期转换为`java.sql.Date`类型的情况。本文将详细介绍如何...

Global site tag (gtag.js) - Google Analytics