安卓系统中如何将双数转换为货币格式?

问题描述 投票:0回答:1

我想用 doublet type data 以货币格式和单独的数字,如下面的例子。

1000.578 -------------------------> 1,000.58

10000.433 ----> 10,000.43

100000.4647474 ----> 100,000.46

我已经用kotlin扩展创建了如下。

fun Double.addAutomaticThousandSeparator() : String {
    val formattedNumber = String.format(Locale.US,"%,02d", this).replace(',', '.')
    return "$formattedNumber"
}

但它不工作,使我的应用程序。force close 和logcat,如下图。

java.util.IllegalFormatConversionException: d != java.lang.Double
        at java.util.Formatter$FormatSpecifier.failConversion(Formatter.java:4402)
        at java.util.Formatter$FormatSpecifier.printInteger(Formatter.java:2884)
        at java.util.Formatter$FormatSpecifier.print(Formatter.java:2838)
        at java.util.Formatter.format(Formatter.java:2523)
        at java.util.Formatter.format(Formatter.java:2458)
        at java.lang.String.format(String.java:2883)
        at co.id.ajsmsig.cs.simpel.shared.extensions.ExtensionsKt.addAutomaticThousandSeparator(Extensions.kt:203)
        at co.id.ajsmsig.cs.simpel.ui.switchingandredirection.switching.from.SwitchingFromAdapter$SwitchingViewHolder.bind(SwitchingFromAdapter.kt:55)
        at co.id.ajsmsig.cs.simpel.ui.switchingandredirection.switching.from.SwitchingFromAdapter.onBindViewHolder(SwitchingFromAdapter.kt:42)
        at co.id.ajsmsig.cs.simpel.ui.switchingandredirection.switching.from.SwitchingFromAdapter.onBindViewHolder(SwitchingFromAdapter.kt:21)
        at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7065)
        at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7107)
        at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6012)
        at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6279)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6118)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6114)
        at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2303)
        at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1627)
        at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
        at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665)
        at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)
        at androidx.recyclerview.widget.RecyclerView.onMeasure(RecyclerView.java:3540)
        at android.view.View.measure(View.java:23169)
        at androidx.constraintlayout.widget.ConstraintLayout.internalMeasureChildren(ConstraintLayout.java:1227)
        at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1572)
        at android.view.View.measure(View.java:23169)
        at androidx.constraintlayout.widget.ConstraintLayout.internalMeasureChildren(ConstraintLayout.java:1227)
        at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1572)
        at android.view.View.measure(View.java:23169)
        at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1308)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at android.widget.ScrollView.onMeasure(ScrollView.java:350)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at android.view.View.measure(View.java:23169)
        at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1676)
        at android.view.View.measure(View.java:23169)
        at androidx.drawerlayout.widget.DrawerLayout.onMeasure(DrawerLayout.java:1119)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
2020-05-06 12:00:19.311 17536-17536/? E/AndroidRuntime:     at android.view.View.measure(View.java:23169)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at com.android.internal.policy.DecorView.onMeasure(DecorView.java:716)
        at android.view.View.measure(View.java:23169)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2718)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1572)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1855)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1460)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7183)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
        at android.view.Choreographer.doCallbacks(Choreographer.java:761)
        at android.view.Choreographer.doFrame(Choreographer.java:696)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

我想问题是出在我创建的格式上. 但我已经搜索了 double to money formatted 在google上,但还是没有找到。你能帮我解决我的kotlin extension 带格式化的 double to money?

谢谢你

android kotlin
1个回答
0
投票

你可以试试用 DecimalFormat.

DecimalFormat是NumberFormat的一个具体子类,用于格式化十进制数字。它具有多种功能,可以在任何地方解析和格式化数字,包括支持西文、阿拉伯文和印度文数字。

 val currency=(100000.4647474).convert()
  println("Value$currency") //100,000.46

然后

 fun Double.convert(): String {
        val format = DecimalFormat("#,###.00")
        format.isDecimalSeparatorAlwaysShown = false
        return format.format(this).toString()
    }

1
投票

你可以创建函数卡盘(3),用", "连接字符串。

fun Double.addAutomaticThousandSeparator()
        = toInt()
    .toString()
    .reversed()
    .chunked(3)
    .joinToString(",")
    .reversed() + if (this % 1 > 0) ".${(this % 1).toString().split(".")[1].take(2)}" else ""

当你想使用它时,你可以简单地调用这样的函数。

val a = 1000.578
val b = 10000.433
val c = 100000.4647474

val formatA = a.addAutomaticThousandSeparator()
val formatB = b.addAutomaticThousandSeparator()

println(formatA)
println(formatB)
println(c.addAutomaticThousandSeparator())

输出

1,000.57
10,000.43
100,000.46
© www.soinside.com 2019 - 2024. All rights reserved.