Skip to content

Commit 3d5be42

Browse files
enh-googleAndroid (Google) Code Review
authored andcommitted
Merge changes I87c2ab9e,I2dafcc34,I731c96c2 into jb-mr1-dev
* changes: Fix formatDateRange month names for Farsi. Use localized digits for Time formatting. Use proper digits in formatElapsedTime and format3339
2 parents 5ca88a1 + 9ccf13c commit 3d5be42

File tree

3 files changed

+70
-46
lines changed

3 files changed

+70
-46
lines changed

core/java/android/text/format/DateUtils.java

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ public class DateUtils
4545

4646
private static final String FAST_FORMAT_HMMSS = "%1$d:%2$02d:%3$02d";
4747
private static final String FAST_FORMAT_MMSS = "%1$02d:%2$02d";
48-
private static final char TIME_PADDING = '0';
4948
private static final char TIME_SEPARATOR = ':';
5049

5150

@@ -648,74 +647,65 @@ public static String formatElapsedTime(StringBuilder recycle, long elapsedSecond
648647
}
649648
}
650649

650+
private static void append(StringBuilder sb, long value, boolean pad, char zeroDigit) {
651+
if (value < 10) {
652+
if (pad) {
653+
sb.append(zeroDigit);
654+
}
655+
} else {
656+
sb.append((char) (zeroDigit + (value / 10)));
657+
}
658+
sb.append((char) (zeroDigit + (value % 10)));
659+
}
660+
651661
/**
652-
* Fast formatting of h:mm:ss
662+
* Fast formatting of h:mm:ss.
653663
*/
654664
private static String formatElapsedTime(StringBuilder recycle, String format, long hours,
655665
long minutes, long seconds) {
656666
if (FAST_FORMAT_HMMSS.equals(format)) {
667+
char zeroDigit = LocaleData.get(Locale.getDefault()).zeroDigit;
668+
657669
StringBuilder sb = recycle;
658670
if (sb == null) {
659671
sb = new StringBuilder(8);
660672
} else {
661673
sb.setLength(0);
662674
}
663-
sb.append(hours);
675+
append(sb, hours, false, zeroDigit);
664676
sb.append(TIME_SEPARATOR);
665-
if (minutes < 10) {
666-
sb.append(TIME_PADDING);
667-
} else {
668-
sb.append(toDigitChar(minutes / 10));
669-
}
670-
sb.append(toDigitChar(minutes % 10));
677+
append(sb, minutes, true, zeroDigit);
671678
sb.append(TIME_SEPARATOR);
672-
if (seconds < 10) {
673-
sb.append(TIME_PADDING);
674-
} else {
675-
sb.append(toDigitChar(seconds / 10));
676-
}
677-
sb.append(toDigitChar(seconds % 10));
679+
append(sb, seconds, true, zeroDigit);
678680
return sb.toString();
679681
} else {
680682
return String.format(format, hours, minutes, seconds);
681683
}
682684
}
683685

684686
/**
685-
* Fast formatting of m:ss
687+
* Fast formatting of mm:ss.
686688
*/
687689
private static String formatElapsedTime(StringBuilder recycle, String format, long minutes,
688690
long seconds) {
689691
if (FAST_FORMAT_MMSS.equals(format)) {
692+
char zeroDigit = LocaleData.get(Locale.getDefault()).zeroDigit;
693+
690694
StringBuilder sb = recycle;
691695
if (sb == null) {
692696
sb = new StringBuilder(8);
693697
} else {
694698
sb.setLength(0);
695699
}
696-
if (minutes < 10) {
697-
sb.append(TIME_PADDING);
698-
} else {
699-
sb.append(toDigitChar(minutes / 10));
700-
}
701-
sb.append(toDigitChar(minutes % 10));
700+
append(sb, minutes, false, zeroDigit);
702701
sb.append(TIME_SEPARATOR);
703-
if (seconds < 10) {
704-
sb.append(TIME_PADDING);
705-
} else {
706-
sb.append(toDigitChar(seconds / 10));
707-
}
708-
sb.append(toDigitChar(seconds % 10));
702+
append(sb, seconds, true, zeroDigit);
709703
return sb.toString();
710704
} else {
711705
return String.format(format, minutes, seconds);
712706
}
713707
}
714708

715-
private static char toDigitChar(long digit) {
716-
return (char) (digit + '0');
717-
}
718-
719709
/**
720710
* Format a date / time such that if the then is on the same day as now, it shows
721711
* just the time and if it's a different day, it shows just the date.
@@ -1387,6 +1377,14 @@ public static Formatter formatDateRange(Context context, Formatter formatter, lo
13871377
String endMonthDayString = isInstant ? null : endDate.format(MONTH_DAY_FORMAT);
13881378
String endYearString = isInstant ? null : endDate.format(YEAR_FORMAT);
13891379

1380+
String startStandaloneMonthString = startMonthString;
1381+
String endStandaloneMonthString = endMonthString;
1382+
// We need standalone months for these strings in Persian (fa): http://b/6811327
1383+
if (!numericDate && !abbrevMonth && Locale.getDefault().getLanguage().equals("fa")) {
1384+
startStandaloneMonthString = startDate.format("%-B");
1385+
endStandaloneMonthString = endDate.format("%-B");
1386+
}
1387+
13901388
if (startMonthNum != endMonthNum) {
13911389
// Same year, different month.
13921390
// Example: "October 28 - November 3"
@@ -1407,7 +1405,8 @@ public static Formatter formatDateRange(Context context, Formatter formatter, lo
14071405
startWeekDayString, startMonthString, startMonthDayString,
14081406
startYearString, startTimeString,
14091407
endWeekDayString, endMonthString, endMonthDayString,
1410-
endYearString, endTimeString);
1408+
endYearString, endTimeString,
1409+
startStandaloneMonthString, endStandaloneMonthString);
14111410
}
14121411

14131412
if (startDay != endDay) {
@@ -1426,7 +1425,8 @@ public static Formatter formatDateRange(Context context, Formatter formatter, lo
14261425
startWeekDayString, startMonthString, startMonthDayString,
14271426
startYearString, startTimeString,
14281427
endWeekDayString, endMonthString, endMonthDayString,
1429-
endYearString, endTimeString);
1428+
endYearString, endTimeString,
1429+
startStandaloneMonthString, endStandaloneMonthString);
14301430
}
14311431

14321432
// Same start and end day

core/java/android/text/format/Time.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,9 @@ public class Time {
151151
private static String sDateTimeFormat;
152152
private static String sAm;
153153
private static String sPm;
154+
private static char sZeroDigit;
155+
156+
// Referenced by native code.
154157
private static String sDateCommand = "%a %b %e %H:%M:%S %Z %Y";
155158

156159
/**
@@ -323,6 +326,7 @@ public String format(String format) {
323326

324327
sAm = localeData.amPm[0];
325328
sPm = localeData.amPm[1];
329+
sZeroDigit = localeData.zeroDigit;
326330

327331
sShortMonths = localeData.shortMonthNames;
328332
sLongMonths = localeData.longMonthNames;
@@ -338,12 +342,32 @@ public String format(String format) {
338342
sLocale = locale;
339343
}
340344

341-
return format1(format);
345+
String result = format1(format);
346+
if (sZeroDigit != '0') {
347+
result = localizeDigits(result);
348+
}
349+
return result;
342350
}
343351
}
344352

345353
native private String format1(String format);
346354

355+
// TODO: unify this with java.util.Formatter's copy.
356+
private String localizeDigits(String s) {
357+
int length = s.length();
358+
int offsetToLocalizedDigits = sZeroDigit - '0';
359+
StringBuilder result = new StringBuilder(length);
360+
for (int i = 0; i < length; ++i) {
361+
char ch = s.charAt(i);
362+
if (ch >= '0' && ch <= '9') {
363+
ch += offsetToLocalizedDigits;
364+
}
365+
result.append(ch);
366+
}
367+
return result.toString();
368+
}
369+
370+
347371
/**
348372
* Return the current time in YYYYMMDDTHHMMSS<tz> format
349373
*/
@@ -673,7 +697,7 @@ public String format3339(boolean allDay) {
673697
int minutes = (offset % 3600) / 60;
674698
int hours = offset / 3600;
675699

676-
return String.format("%s%s%02d:%02d", base, sign, hours, minutes);
700+
return String.format(Locale.US, "%s%s%02d:%02d", base, sign, hours, minutes);
677701
}
678702
}
679703

core/res/res/values-fa/donottranslate-cldr.xml

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,22 +37,22 @@
3737
<string name="time_wday_date">%1$s،‏ %2$s %3$s</string>
3838
<string name="wday_date">%2$s %3$s</string>
3939
<string name="time_wday">%1$s،‏ %2$s</string>
40-
<string name="same_year_md1_md2">%3$s LLLL تا %8$s LLLL</string>
41-
<string name="same_year_wday1_md1_wday2_md2">%1$s %3$s LLLL تا %6$s %8$s LLLL</string>
42-
<string name="same_year_md1_time1_md2_time2">%5$s،‏ %3$s LLLL تا %10$s،‏ %8$s LLLL</string>
43-
<string name="same_month_md1_time1_md2_time2">%5$s،‏ %3$s LLLL تا %10$s،‏ %8$s LLLL</string>
44-
<string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s،‏ %1$s %3$s LLLL تا %10$s،‏ %6$s %8$s LLLL</string>
45-
<string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s،‏ %1$s %3$s LLLL تا %10$s،‏ %6$s %8$s LLLL</string>
40+
<string name="same_year_md1_md2">%3$s %11$s تا %8$s %12$s</string>
41+
<string name="same_year_wday1_md1_wday2_md2">%1$s %3$s %11$s تا %6$s %8$s %12$s</string>
42+
<string name="same_year_md1_time1_md2_time2">%5$s،‏ %3$s %11$s تا %10$s،‏ %8$s %12$s</string>
43+
<string name="same_month_md1_time1_md2_time2">%5$s،‏ %3$s %11$s تا %10$s،‏ %8$s %12$s</string>
44+
<string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s،‏ %1$s %3$s %11$s تا %10$s،‏ %6$s %8$s %12$s</string>
45+
<string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s،‏ %1$s %3$s %11$s تا %10$s،‏ %6$s %8$s %12$s</string>
4646
<string name="same_year_mdy1_time1_mdy2_time2">%5$s،‏ %3$s %2$s %4$s تا %10$s،‏ %8$s %7$s %9$s</string>
4747
<string name="same_month_mdy1_time1_mdy2_time2">%5$s،‏ %3$s %2$s %4$s تا %10$s،‏ %8$s %7$s %9$s</string>
4848
<string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s،‏ %1$s %3$s %2$s %4$s تا %10$s،‏ %6$s %8$s %7$s %9$s</string>
4949
<string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s،‏ %1$s %3$s %2$s %4$s تا %10$s،‏ %6$s %8$s %7$s %9$s</string>
5050
<string name="same_month_wday1_mdy1_wday2_mdy2">%1$s %3$s %2$s %4$s تا %6$s %8$s %7$s %9$s</string>
51-
<string name="same_month_md1_md2">%3$s تا %8$s LLL</string>
52-
<string name="same_month_wday1_md1_wday2_md2">%1$s %3$s LLLL تا %6$s %8$s LLLL</string>
53-
<string name="same_year_mdy1_mdy2">%3$s LLL تا %8$s %2$s %9$s</string>
51+
<string name="same_month_md1_md2">%3$s تا %8$s %11$s</string>
52+
<string name="same_month_wday1_md1_wday2_md2">%1$s %3$s %11$s تا %6$s %8$s %12$s</string>
53+
<string name="same_year_mdy1_mdy2">%3$s %11$s تا %8$s %7$s %9$s</string>
5454
<string name="same_month_mdy1_mdy2">%3$s تا %8$s %2$s %9$s</string>
55-
<string name="same_year_wday1_mdy1_wday2_mdy2">%1$s %3$s LLL تا %6$s %8$s %2$s %9$s</string>
55+
<string name="same_year_wday1_mdy1_wday2_mdy2">%1$s %3$s %11$s تا %6$s %8$s %7$s %9$s</string>
5656
<string name="short_format_month">%b</string>
5757
<string name="full_wday_month_day_no_year">E d LLLL</string>
5858
<string name="abbrev_wday_month_day_no_year">E d LLLL</string>

0 commit comments

Comments
 (0)