我有一个字符串,看起来是这样的:“N年N个月ñWEEKS N天”(注意,常数可能会或可能不会使用复数)转换普通语言持续时间乔达期或ISO 8601
我需要将其转换为Joda Period对象或ISO 8601格式的字符串(可以将其转换为Period对象)。
没有人有任何的代码,也可以点我到库做到这一点?
更新:如果有人需要这样做,这里是工作代码。不幸的是,我必须动态构建PeriodFormatterBuilder,因为这些字段是可选的。有点丑,但它有效。
UPDATE2:修正错误在评论中指出。
String text = expr1a.getText();
System.out.println(text);
PeriodFormatterBuilder pfb = new PeriodFormatterBuilder().printZeroAlways();
int yearIndex = text.indexOf("YEAR");
int monthIndex = text.indexOf("MONTH");
int weekIndex = text.indexOf("WEEK");
int dayIndex = text.indexOf("DAY");
if (yearIndex > -1) {
pfb = pfb.appendYears().appendSuffix(" YEAR"," YEARS");
}
if (monthIndex > -1) {
if (yearIndex > -1) {
pfb = pfb.appendPrefix(" ").appendMonths().appendSuffix(" MONTH", " MONTHS");
} else {
pfb = pfb.appendMonths().appendSuffix(" MONTH", " MONTHS");
}
}
if (weekIndex > -1) {
if (yearIndex > -1 || monthIndex > -1) {
pfb = pfb.appendPrefix(" ").appendWeeks().appendSuffix(" WEEK", " WEEKS");
} else {
pfb = pfb.appendWeeks().appendSuffix(" WEEK", " WEEKS");
}
}
if (dayIndex > -1) {
if (yearIndex > -1 || monthIndex > -1 || weekIndex > -1) {
pfb = pfb.appendPrefix(" ").appendDays().appendSuffix(" DAY"," DAYS");
} else {
pfb = pfb.appendDays().appendSuffix(" DAY"," DAYS");
}
}
PeriodFormatter pf = pfb.toFormatter();
Period period = Period.parse(text, pf);
return period;
您需要解析字符串并提取值,然后从它们创建Joda持续时间应该相当简单。看一看java的一些词法分析器实现,例如http://www.giocc.com/writing-a-lexer-in-java-1-7-using-regex-named-capturing-groups.html。 –
如果没有'YEAR'值,那么格式化程序会在月份值前加一个额外的空格,这会在解析'4 MONTHS'时导致失败。 – SpaceTrucker