`
wuyuhou
  • 浏览: 13907 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

固定长度格式化

阅读更多
/**
 * 固定长度格式化器
 * 
 * @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字符串长度格式化

    "pb字符串长度格式化"这个主题关注的是如何调整字符串的长度,使其符合特定的标准,这通常涉及到字符串的截取、填充以及转换等操作。在编程语言如PowerBuilder(PB)中,这类操作对于数据展示、数据库交互以及遵循...

    格式化写入字符串_labview_

    在这个“格式化写入字符串_labview_”的主题中,我们将深入探讨LabVIEW中如何处理字符串,特别是格式化字符串的方法。 在LabVIEW中,字符串操作是相当重要的,因为它们在数据表示、日志记录、用户界面交互等方面...

    设置字符串每行固定长度

    在编程领域,尤其是在C#语言中...总的来说,通过合理地使用C#提供的字符串处理方法,我们可以轻松实现字符串每行固定长度的格式化输出。这个功能在各种文本处理场景中都非常实用,能帮助我们生成整洁、易读的输出结果。

    数字字符串格式化指定长度

    运用JAVAScript自定义函数,实现数字字符的格式化转换,在实际网站开发中,有很多地方可以适用,不难却很实用。

    Windows系统格式化 Fat16分析

    Windows系统格式化Fat16分析 Fat16文件系统是微软公司在早期操作系统中使用的一种文件系统格式。它是基于FAT(File Allocation Table,文件分配表)文件系统的第一个版本,于1981年引入。Fat16文件系统广泛应用于...

    文档格式化为指定长度(包括中文字符)mfc

    // 假设我们要按10个字符长度格式化 return 0; } ``` 在`FormatText`函数中,我们首先读取文件内容到`CString`类型的`text`变量。然后,你需要实现一个函数或方法,将`text`分割成长度为`length`的子串。对于包含...

    EdText去除回车,固定输入长度

    这个功能在某些场景下非常有用,比如格式化数据、处理固定宽度的文本列或创建特定格式的输入。 ### 1. 去除回车(Carriage Return) 回车键(CR)在文本处理中通常表示新的一行开始。在ASCII码中,回车符的值为13...

    python print 格式化输出,动态指定长度的实现

    1. **固定长度格式输出**: 在Python 2.x中,可以使用`%`运算符进行格式化输出。例如,`%s`表示字符串,`%10s`则意味着输出的字符串将被填充到至少10个字符的宽度,不足部分用空格填充。以下是一个例子: ```...

    报文格式化程序.zip

    在IT领域,报文格式化是一项重要的任务,尤其在通信协议、数据分析以及日志解析等场景中。"报文格式化程序.zip" 提供的工具就是为了解决这类问题,帮助用户将原始、混乱的报文数据转化为清晰、可读性强的格式。下面...

    python 按照固定长度分割字符串的方法小结

    在Python编程语言中,分割字符串是一项常见的操作,尤其在处理数据或者格式化输出时。本文主要探讨了如何按照固定长度来分割字符串,以满足特定的需求,例如将MAC地址转换为标准格式。以下是对两种实现方法的详细...

    php生成固定长度纯数字编码的方法

    这些技巧可以帮助开发者生成像订单编号、卡号、用户编号这样的唯一且固定长度的数字编码。在具体实现中,一般会采用一种编码转换的算法,这种算法通常与数字的位数和一个特定的映射数组有关。 首先,PHP中创建一个...

    javascript格式化数字

    ### JavaScript 数字格式化方法详解 在日常的前端开发中,对数字进行格式化处理是一项常见的需求,尤其是在处理财务数据、统计报告或是任何需要友好显示数值的场景下。本文将深入解析一个JavaScript函数,该函数...

    java 字符串指定长度

    标题中的“Java 字符串指定长度”指的是在Java编程中,如何处理字符串以确保它们...不过,在前端开发中,如果需要将Java后端返回的数据展示在网页上,可能会涉及到字符串的格式化和长度控制,这时jQuery就有可能用到。

    固定大小格式化程序

    标题中的“固定大小格式化程序”指的是一个专门用于处理固定长度数据字段的工具或框架,这种格式常见于一些传统的企业级应用,如金融系统、库存管理系统等,它们通常需要按照特定的规范存储和交换数据,这些规范往往...

    USART1固定长度数据包(hex)例程

    在本文中,我们将深入探讨如何在STM32微控制器上实现一个基于USART1的固定长度数据包接收例程,特别是处理十六进制(hex)格式的数据。STM32是一款广泛应用于嵌入式系统的高性能微处理器,其串行通信接口(USART)是...

    CString.Format格式化输出和ToString()的一些常用用法.pdf

    10. 可以通过数字格式化的方式格式化整数,例如在表示电话号码时使用特定的模式来格式化输出。 通过以上知识点,可以看出C#中字符串格式化功能十分强大,可以灵活地处理数字、日期时间等多种数据类型的显示格式。这...

    C语言编程例题(有关数字长度)

    - 根据不同的数字长度输出格式化后的结果。 - 使用`getchar()`暂停程序,等待用户按键后退出。 #### 代码实现 ```c #include #include int main() { char array[9]; // 存储输入的数字 int size; // 输入...

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

    通过以上三个方法,我们可以灵活地处理字符串长度不足的情况,无论是简单的在前面补0还是使用更高级的格式化工具。这些方法都非常实用,尤其是在处理数据编号、日期时间等场景时非常有用。掌握这些技巧可以帮助我们...

    C#String.Format数字格式化

    ### C#中的String.Format方法与数字格式化 在C#编程语言中,`String.Format`是一种非常实用且灵活的方法,用于格式化字符串输出。通过该方法可以方便地控制数字、日期时间等数据类型的显示格式,这在实际开发过程中...

    固定长度文件处理程序:漂亮的Kotlin DSL中固定长度文件的处理程序

    1. `Field`类:表示固定长度的字段,包含字段名、长度和解析/格式化逻辑。 2. `Record`类:组合多个`Field`对象,代表一条记录。 3. `FileParser`类:负责读取和写入固定长度文件,使用定义好的`Record`对象来解析和...

Global site tag (gtag.js) - Google Analytics