diff --git a/src/main/java/org/codelibs/fess/taglib/FessFunctions.java b/src/main/java/org/codelibs/fess/taglib/FessFunctions.java index f83136c26..19d83b01c 100644 --- a/src/main/java/org/codelibs/fess/taglib/FessFunctions.java +++ b/src/main/java/org/codelibs/fess/taglib/FessFunctions.java @@ -23,6 +23,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.text.DecimalFormat; +import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -154,25 +155,49 @@ public class FessFunctions { return date.format(DateTimeFormatter.ofPattern(Constants.ISO_DATETIME_FORMAT, Locale.ROOT)); } - public static String formatNumber(final long value) { - int ratio = 1; - String unit = ""; + public static String formatNumber(final long value, final String pattern) { + final DecimalFormat df = (DecimalFormat) NumberFormat.getNumberInstance(getUserLocale()); + df.applyPattern(pattern); + return df.format(value); + } + + private static Locale getUserLocale() { + final Locale locale = ComponentUtil.getRequestManager().getUserLocale(); + if (locale == null) { + return Locale.ROOT; + } + return locale; + } + + public static String formatFileSize(final long value) { + double target = (double) value; + String unit = ""; // TODO l10n? String format = "0.#"; if (value < 1024) { format = "0"; - } else if (value < (1024 * 1024)) { - ratio = 1024; + } else if (value < 1024L * 1024L) { + target /= 1024; unit = "K"; - } else if (value < (1024 * 1024 * 1024)) { - ratio = 1024 * 1024; + } else if (value < 1024L * 1024L * 1024L) { + target /= 1024; + target /= 1024; unit = "M"; - } else { - ratio = 1024 * 1024 * 1024; + } else if (value < 1024L * 1024L * 1024L * 1024L) { + target /= 1024; + target /= 1024; + target /= 1024; unit = "G"; + } else { + target /= 1024; + target /= 1024; + target /= 1024; + target /= 1024; + unit = "T"; } - final DecimalFormat df = new DecimalFormat(format + unit); + final DecimalFormat df = (DecimalFormat) NumberFormat.getNumberInstance(getUserLocale()); + df.applyPattern(format); df.setRoundingMode(RoundingMode.HALF_UP); - return df.format((double) value / ratio); + return df.format(target) + unit; } public static String pagingQuery(final String query) { diff --git a/src/main/webapp/WEB-INF/fe.tld b/src/main/webapp/WEB-INF/fe.tld index 0ef90486e..7e2193d49 100644 --- a/src/main/webapp/WEB-INF/fe.tld +++ b/src/main/webapp/WEB-INF/fe.tld @@ -71,15 +71,27 @@ + + + Returns formatted number as a file size from a given value. + + formatFileSize + org.codelibs.fess.taglib.FessFunctions + java.lang.String formatFileSize(long) + + ${fe:formatFileSize(doc.content_length)} + + + Returns formatted number from a given value. formatNumber org.codelibs.fess.taglib.FessFunctions - java.lang.String formatNumber(long) + java.lang.String formatNumber(long, java.lang.String) - ${fe:formatNumber(doc.content_length)} + ${fe:formatNumber(doc.content_length, "###,###")} diff --git a/src/main/webapp/WEB-INF/view/searchResults.jsp b/src/main/webapp/WEB-INF/view/searchResults.jsp index 80b9feb2d..01f8b6bdd 100644 --- a/src/main/webapp/WEB-INF/view/searchResults.jsp +++ b/src/main/webapp/WEB-INF/view/searchResults.jsp @@ -5,12 +5,12 @@

@@ -69,7 +69,7 @@ + arg0="${fe:formatFileSize(doc.similar_docs_count-1)}" /> @@ -103,7 +103,7 @@ + arg0="${fe:formatFileSize(doc.content_length)}" />

diff --git a/src/test/java/org/codelibs/fess/taglib/FessFunctionsTest.java b/src/test/java/org/codelibs/fess/taglib/FessFunctionsTest.java index 923495620..e02e1cbc3 100644 --- a/src/test/java/org/codelibs/fess/taglib/FessFunctionsTest.java +++ b/src/test/java/org/codelibs/fess/taglib/FessFunctionsTest.java @@ -20,6 +20,21 @@ import java.util.Date; import org.codelibs.fess.unit.UnitFessTestCase; public class FessFunctionsTest extends UnitFessTestCase { + public void test_formatNumber() { + assertEquals("0", FessFunctions.formatNumber(0, "###,###")); + assertEquals("1,000", FessFunctions.formatNumber(1000, "###,###")); + assertEquals("1,000,000", FessFunctions.formatNumber(1000000, "###,###")); + } + + public void test_formatFileSize() { + assertEquals("0", FessFunctions.formatFileSize(0)); + assertEquals("1000", FessFunctions.formatFileSize(1000)); + assertEquals("976.6K", FessFunctions.formatFileSize(1000000)); + assertEquals("953.7M", FessFunctions.formatFileSize(1000000000)); + assertEquals("931.3G", FessFunctions.formatFileSize(1000000000000L)); + assertEquals("909.5T", FessFunctions.formatFileSize(1000000000000000L)); + } + public void test_parseDate() { Date date;