/**
* 固定长度格式化器
*
* @author wuyuhou
*
*/
public class FixedLengthFormatter {
//对齐方式
public static enum Alignment {
LEFT,//左对齐
MIDDLE,//居中
RIGHT//右对齐
}
//对齐方式,默认左对齐
private Alignment alignment = Alignment.LEFT;
//长度
private int fixedLength = 0;
//填充符号
private String fillSymbol = null;
//是否以字节长度计算,默认是以字符长度计算
private boolean isByteMode = false;
public FixedLengthFormatter() {
}
public Alignment getAlignment() {
return alignment;
}
public void setAlignment(Alignment alignment) {
if (alignment == null) {
throw new IllegalArgumentException("Alignment is null!");
}
this.alignment = alignment;
}
public String getFillSymbol() {
return fillSymbol;
}
public void setFillSymbol(String fillSymbol) {
if (fillSymbol == null) {
throw new IllegalArgumentException("fillSymbol is null!");
}
if (fillSymbol.length() > 1) {
throw new IllegalArgumentException("fillSymbol length > 1");
}
this.fillSymbol = fillSymbol;
}
public int getFixedLength() {
return fixedLength;
}
public void setFixedLength(int fixedLength) {
if (fixedLength == 0) {
throw new IllegalArgumentException("fixedLength is zero!");
}
this.fixedLength = fixedLength;
}
public boolean isByteMode() {
return isByteMode;
}
public void setByteMode(boolean isByteMode) {
this.isByteMode = isByteMode;
}
protected void doCheck() {
if (fixedLength == 0) {
throw new FormatRuntimeException("FixedLength is zero, please set it!");
}
if (fillSymbol == null) {
throw new FormatRuntimeException("FillSymbol is null, please set it!");
}
}
public String format(String data) {
int actualLength = 0;
if (isByteMode) {
actualLength = data.getBytes().length;
} else {
actualLength = data.length();
}
//需要填充的长度
int fillLength = fixedLength - actualLength;
if (fillLength == 0) {
return data;
} else if (fillLength < 0) {
//截取
if (isByteMode) {
if (actualLength / 2 > fixedLength) {
for (int i = 1; i < data.length(); i++) {
if (data.substring(0, i).getBytes().length > fixedLength) {
return data.substring(0, i - 1);
}
}
} else {
for (int i = data.length() - 2; i >= 0; i--) {
String result = data.substring(0, i);
if (result.getBytes().length <= fixedLength) {
return result;
}
}
}
} else {
return data.substring(0, fixedLength);
}
} else {
int fillSymbolByteLength = fillSymbol.getBytes().length;
int halfFillLength = fillLength / 2;
//取左边的一半
StringBuilder bufLeftHalf = new StringBuilder();
for (int i = 0; i < halfFillLength; i++) {
if (isByteMode) {
if (fillSymbolByteLength * (i + 1) > halfFillLength) {
break;
}
}
bufLeftHalf.append(fillSymbol);
}
int leftByteLength = bufLeftHalf.toString().getBytes().length;
//右边的一半
StringBuilder bufRightHalf = new StringBuilder();
for (int i = halfFillLength; i < fillLength; i++) {
if (isByteMode) {
if (fillSymbolByteLength * (i - halfFillLength + 1) + leftByteLength > fillLength) {
break;
}
}
bufRightHalf.append(fillSymbol);
}
//补齐
if (Alignment.LEFT.equals(alignment)) {
return data + bufLeftHalf.append(bufRightHalf.toString()).toString();
} else if (Alignment.RIGHT.equals(alignment)) {
return bufLeftHalf.append(bufRightHalf.toString()).append(data).toString();
} else {
return bufLeftHalf.append(data).append(bufRightHalf.toString()).toString();
}
}
throw new FormatRuntimeException("Does not format data[{0}]!", new Object[]{data});
}
public String unformat(String data) {
int actualLength = 0;
if (isByteMode) {
actualLength = data.getBytes().length;
} else {
actualLength = data.length();
}
if (actualLength > fixedLength) {
throw new FormatRuntimeException("Data[{0}] length[{1}] is greater than fixedLength[{2}]!",
new Object[]{data, actualLength, fixedLength});
}
if (Alignment.LEFT.equals(alignment)) {
int index = data.length() - 1;
for (; index >= 0; index--) {
if (!fillSymbol.equals(data.substring(index, index + 1))) {
break;
}
}
return data.substring(0, index + 1);
} else if (Alignment.RIGHT.equals(alignment)) {
int index = 0;
for (; index < data.length(); index++) {
if (!fillSymbol.equals(data.substring(index, index + 1))) {
break;
}
}
return data.substring(index);
} else {
int index = 0;
for (; index < data.length(); index++) {
if (!fillSymbol.equals(data.substring(index, index + 1))) {
break;
}
}
data = data.substring(index);
index = data.length() - 1;
for (; index >= 0; index--) {
if (!fillSymbol.equals(data.substring(index, index + 1))) {
break;
}
}
return data.substring(0, index + 1);
}
}
}
分享到:
相关推荐
"pb字符串长度格式化"这个主题关注的是如何调整字符串的长度,使其符合特定的标准,这通常涉及到字符串的截取、填充以及转换等操作。在编程语言如PowerBuilder(PB)中,这类操作对于数据展示、数据库交互以及遵循...
在这个“格式化写入字符串_labview_”的主题中,我们将深入探讨LabVIEW中如何处理字符串,特别是格式化字符串的方法。 在LabVIEW中,字符串操作是相当重要的,因为它们在数据表示、日志记录、用户界面交互等方面...
在编程领域,尤其是在C#语言中...总的来说,通过合理地使用C#提供的字符串处理方法,我们可以轻松实现字符串每行固定长度的格式化输出。这个功能在各种文本处理场景中都非常实用,能帮助我们生成整洁、易读的输出结果。
运用JAVAScript自定义函数,实现数字字符的格式化转换,在实际网站开发中,有很多地方可以适用,不难却很实用。
Windows系统格式化Fat16分析 Fat16文件系统是微软公司在早期操作系统中使用的一种文件系统格式。它是基于FAT(File Allocation Table,文件分配表)文件系统的第一个版本,于1981年引入。Fat16文件系统广泛应用于...
// 假设我们要按10个字符长度格式化 return 0; } ``` 在`FormatText`函数中,我们首先读取文件内容到`CString`类型的`text`变量。然后,你需要实现一个函数或方法,将`text`分割成长度为`length`的子串。对于包含...
这个功能在某些场景下非常有用,比如格式化数据、处理固定宽度的文本列或创建特定格式的输入。 ### 1. 去除回车(Carriage Return) 回车键(CR)在文本处理中通常表示新的一行开始。在ASCII码中,回车符的值为13...
1. **固定长度格式输出**: 在Python 2.x中,可以使用`%`运算符进行格式化输出。例如,`%s`表示字符串,`%10s`则意味着输出的字符串将被填充到至少10个字符的宽度,不足部分用空格填充。以下是一个例子: ```...
在IT领域,报文格式化是一项重要的任务,尤其在通信协议、数据分析以及日志解析等场景中。"报文格式化程序.zip" 提供的工具就是为了解决这类问题,帮助用户将原始、混乱的报文数据转化为清晰、可读性强的格式。下面...
在Python编程语言中,分割字符串是一项常见的操作,尤其在处理数据或者格式化输出时。本文主要探讨了如何按照固定长度来分割字符串,以满足特定的需求,例如将MAC地址转换为标准格式。以下是对两种实现方法的详细...
这些技巧可以帮助开发者生成像订单编号、卡号、用户编号这样的唯一且固定长度的数字编码。在具体实现中,一般会采用一种编码转换的算法,这种算法通常与数字的位数和一个特定的映射数组有关。 首先,PHP中创建一个...
### JavaScript 数字格式化方法详解 在日常的前端开发中,对数字进行格式化处理是一项常见的需求,尤其是在处理财务数据、统计报告或是任何需要友好显示数值的场景下。本文将深入解析一个JavaScript函数,该函数...
标题中的“Java 字符串指定长度”指的是在Java编程中,如何处理字符串以确保它们...不过,在前端开发中,如果需要将Java后端返回的数据展示在网页上,可能会涉及到字符串的格式化和长度控制,这时jQuery就有可能用到。
标题中的“固定大小格式化程序”指的是一个专门用于处理固定长度数据字段的工具或框架,这种格式常见于一些传统的企业级应用,如金融系统、库存管理系统等,它们通常需要按照特定的规范存储和交换数据,这些规范往往...
在本文中,我们将深入探讨如何在STM32微控制器上实现一个基于USART1的固定长度数据包接收例程,特别是处理十六进制(hex)格式的数据。STM32是一款广泛应用于嵌入式系统的高性能微处理器,其串行通信接口(USART)是...
10. 可以通过数字格式化的方式格式化整数,例如在表示电话号码时使用特定的模式来格式化输出。 通过以上知识点,可以看出C#中字符串格式化功能十分强大,可以灵活地处理数字、日期时间等多种数据类型的显示格式。这...
- 根据不同的数字长度输出格式化后的结果。 - 使用`getchar()`暂停程序,等待用户按键后退出。 #### 代码实现 ```c #include #include int main() { char array[9]; // 存储输入的数字 int size; // 输入...
通过以上三个方法,我们可以灵活地处理字符串长度不足的情况,无论是简单的在前面补0还是使用更高级的格式化工具。这些方法都非常实用,尤其是在处理数据编号、日期时间等场景时非常有用。掌握这些技巧可以帮助我们...
### C#中的String.Format方法与数字格式化 在C#编程语言中,`String.Format`是一种非常实用且灵活的方法,用于格式化字符串输出。通过该方法可以方便地控制数字、日期时间等数据类型的显示格式,这在实际开发过程中...
1. `Field`类:表示固定长度的字段,包含字段名、长度和解析/格式化逻辑。 2. `Record`类:组合多个`Field`对象,代表一条记录。 3. `FileParser`类:负责读取和写入固定长度文件,使用定义好的`Record`对象来解析和...