我正在我的kotlin/Java项目中使用一种格式来显示符号,该格式正在做它应该做的事情,在正值之前有正号,在负值之前有负号. 然而,零有一个正号,这是我的问题,我不希望0前面有任何正号.

此代码显示示例+1 +2 +3. -1 -2-3..对于零,它的正号为+0. 我希望零没有符号.

private companion object {
        const val DECIMAL_SIGN_FORMAT = "+#;-#"
    }
private val numberSignFormatter = DecimalFormat(DECIMAL_SIGN_FORMAT)
numberSignFormatter.format(progress).toString()

推荐答案

我认为这不能用任何Java API(或者Kotlin,就这一点而言,它只是提供了Java API周围的包装器)直接完成.

您始终可以定义自己的函数,定期格式化数字,然后删除+.

简单的版本可能是这样的:

inline fun String.formatZeroWithoutSign(number: Number): String =
    format(number).replace("+0", "0")

您可以这样使用它(或choose any other format you like):

"%1$+d".formatZeroWithoutSign(progress)

我 Select 了printf风格的格式器,因为它更容易使用,但如果您想坚持使用,显然也可以用DecimalFormat来完成.

正如 comments 中还指出的那样,这可能不会在所有情况下都产生准确的结果.更狭窄的方法会更容易复发:

inline fun String.formatZeroAs0(number: Number): String =
    if (number == 0) "0"
    else format(number)

使用此功能,您一次只能格式化一个数字,但其行为更可预测:除非提供0,否则它将使用给定模式格式化数字,然后它将绕过所有格式化,只输出"0".

顺便说一句,如果您使用Android,Android SDK提供了内置以下功能的NumberFormatter:

NumberFormatter
    .withLocale(...)
    .sign(SignDisplay.EXCEPT_ZERO)
    .format(progress)

Java相关问答推荐

Collections.binarySearch()使用Collections.reverseOrder()作为比较器返回-1

Java 22模式匹配不适用于记录模式匹配.给出汇编问题

如何使用解析器组合子解析Java数组类型签名?

替换com. sun. jndi. dns. DnsContextFactory Wildfly23 JDK 17

对于几乎不涉及逻辑的请求,您是否应该使用命令模式?

R.id.main给我一个红色错误,无法解析MainActivity.java中的符号main

将不受支持的时区UT重写为UTC是否节省?

JPanel透支重叠的JComcoBox

如何获取Instant#of EpochSecond(?)的最大值

Javadoc在方法摘要中省略方法

基于接口的投影、原生查询和枚举

Java连接池无法正常工作

迁移到Java 17后,日期显示不准确

如何在不删除Java中已有内容的情况下覆盖文件内容?

A.ForEach与For(类型a:集合)

如何在运行docker的应用程序中获取指定的配置文件

活泼的一次判断成语,结果中等

如何修复Spring Boot应用程序中的RestDocumentationGenerationException:java.io.FileNotFoundException:/curl-request.adoc(只读文件系统)?

验证没有';t work on Hibernate Entity';s字段

Spring Mapstruct如何获取Lazy初始化实体字段的信息?