Kev*_*uli 6 java formatting parsing
我正在使用Java 5为内部企业使用构建通用数据转换工具.各个部门对坐标信息(纬度/经度)使用不同的格式,并且他们希望以自己的格式查看数据.例如,白宫以DMS格式的坐标是
38°53'55.133"N,77°02'15.691"W
但也可以表达为:
385355.133/-0770215.691
我希望将每个系统所需的模式表示为字符串,然后使用这些模式来解析输入系统中的实例数据,并在格式化字符串以供输出系统使用时使用该模式.
因此它与日期/时间格式化问题没有什么不同,JDK提供了java.text.SimpleDateFormat,它允许您在各种日期/时间模式之间进行转换,这些模式由字符串定义,例如"YYYY-MM-DD"或"MM"/DD/YY".
我的问题是,我是否必须从头开始构建这个CoordinateFormat的东西,还是有一个很好的通用工具或明确的方法我可以用来指导我这项工作?
如果我没看错的话,您正在谈论解释器模式解决的问题,但有点双向。
有一些简单的方法可以获得良好的通用接口,这样您就可以运行其余的东西。我对此的建议是这样的:
public interface Interpreter<OutputType> {
public void setCode(String coding);
public OutputType decode(String formattedData);
public String encode(OutputType rawData); }
Run Code Online (Sandbox Code Playgroud)
然而,具体实施存在一些障碍。对于您的日期示例,您可能需要处理“9/9/09”、“9 SEP 09”、“2009 年 9 月 9 日”。第一种“日期”很简单 - 数字和设置分隔符,但其他两种都非常讨厌。老实说,做一些完全通用的事情(可能已经被取消)可能是不合理的,所以我推荐以下内容。
我会在两个层面上攻击它,第一个层面非常简单,使用正则表达式和格式字符串:将数据字符串分解为将成为原始数据的内容。您可以为第一个提供“D*/M*/YY”(或“M*/D*”),为第二个提供“D* MMM YY”,以及“Mm+ D*e*, YYYY”最后,您在数据中定义了一些保留符号(D,M,Y,明显的解释)和所有数据类型(*可能有多个字符,+“完整”输出,e定义了无关字符)-这些符号显然是特定于您的应用程序的。然后,您的正则表达式会将字符串切碎,将与每个保留字符相关的所有内容提供给各个数据字段,并将装饰部分(逗号等)保存在某些格式化字符串中。
第一级可以是相当通用的——每种数据类型(例如,日期、坐标、地址)都有保留符号(它们不与任何格式字符重叠),并且所有数据类型都有一些共享符号。也许 Interpreter 接口也有public List<Character> reservedSymbols()
和public void splitCode(List<String> splitcodes)
方法,或者可能有保证字段,这样您就可以将分隔符设为外部类并传入结果。
第二级不太容易,因为它涉及到不能通用的部分。根据保留符号的格式,各个字段需要知道如何呈现自己。对于日期示例,MM 会告诉月份打印为 (01, 02, ... 12),M* 打印为 (1, 2, ... 12),MMM 打印为 (JAN, FEB, ... DEC) ,嗯,如(一月,二月,...十二月)等。如果您的公司在某种程度上保持一致,或者不会冒险偏离标准表示太远,那么对其中每一个进行手动编码应该不会太糟糕(并且事实上,每种数据类型中可能都有一些聪明的方法来减少重复的代码)。但我认为概括所有这些东西并不实际 - 我的意思是,实际上表示可以表示为数字或字符(例如月份)或可以从部分数据推断出的整个数据的东西(例如,从年份到世纪) )或如何从数据中获取截断的表示(例如,年份的截断是最后两位数字,而最正常的数字截断为两位前导数字)可能会花费与手写这些情况一样长的时间,尽管我想我可以想象一下您的应用程序的情况,这种权衡可能是值得的。日期确实是一个棘手的例子,但我当然可以看到其他类型的数据也会出现同样棘手的情况。
概括:
-您可以用一个简单的通用面孔来解决您的问题,因此您的应用程序的其余部分可以围绕它进行编码。
- 通过使用通用保留符号,然后为每种数据类型保留符号,可以实现相当简单且通用的第一遍解析;确保它们不会与格式中出现的符号冲突
-对于各个数据位有一个有点乏味的最终编码阶段
归档时间: |
|
查看次数: |
313 次 |
最近记录: |