【问题标题】:c#: 'Inline' remove the decimal part, and then seperate the remained value by cama seperatorc#: 'Inline' 去掉小数部分,然后用逗号分隔余数
【发布时间】:2017-06-19 11:26:30
【问题描述】:

我想使用 Razor 在我的 .cshtml 文件中将 12345.678 显示为 12,345。 有没有INLINE解决方案?

当我使用时:

<td>  @(myValue != null ? myValue.ToString().Substring(myValue.ToString().IndexOf(".") + 1).ToString("#,##0") : '-')</td>

错误信息是:

string.ToString(System.IFormatProvider)”的最佳重载方法匹配有一些无效参数

对于:

<td>@(myValue != null ? myValue.ToString().Format("{0:0}", myValue).ToString("#,##0") : '-')</td>

错误信息是:

无法通过实例引用访问成员“string.Format(string, object)”;

【问题讨论】:

  • myValue的类型是什么?
  • 它很长(Int64)
  • 12345.678 怎么可能是long
  • 谢谢,这是另一个错误! myValue= Convert.ToInt64(ViewBag.MyVal)
  • 不客气。您可能应该编辑您的问题以使其更清楚:指定myValue 的类型、它的实际值、它如何传递给视图以及您希望它如何出现在视图中。

标签: c# string razor


【解决方案1】:

根据 OP 中的 cmets,您似乎正在通过 ViewBagdouble 传递给视图,将其转换为 long,然后尝试将其格式化为内联?

基本上:

  • 12345.678D转换为long,从而变成12345
  • 12345 格式化为12,345

这应该可行:

<td>@string.Format("{0:n0}", Convert.ToInt64(ViewBag.MyVal))</td>

请记住,正如@David 已经指出的那样,最好将视图模型传递回视图,而不是ViewBagmyValue 是视图模型本身的属性。您可以在我的回答 here 中了解如何实现视图模型。

话虽如此,至少我会通过创建自己的类(我们称之为MyHtmlHelper)来抽象逻辑,该类扩展HtmlHelper

namespace System.Web.Mvc.Html
{
    public static class MyHtmlHelper
    {
        public static string DoubleToFormattedLong(this HtmlHelper html, double myValue)
        {
            var longValue = Convert.ToInt64(myValue);
            return string.Format("{0:n0}", longValue);
        }
    }
}

用法:

<td>@Html.DoubleToFormattedLong((double)ViewBag.MyVal)</td>

在我的示例中我没有执行任何验证,但理想情况下也应该进行验证。

【讨论】:

    【解决方案2】:

    对于第二个,正如错误所说,您试图在字符串的实例上调用.Format(),但.Format()static 方法。所以不要这样:

    myValue.ToString().Format("{0:0}", myValue).ToString("#,##0")
    

    你会这样做:

    string.Format("{0:0}", myValue).ToString("#,##0")
    

    请注意,myValue 作为参数传递给 static 方法,您不会在对象本身上调用该方法。

    顺便说一句,一般来说,当您使用任何类型的 MVC(或 MVVM 等)模式并发现自己尝试在视图中执行甚至是远程复杂的内联代码时,您真正需要的是将计算属性添加到您的模型,然后绑定到该属性。逻辑属于视图模型,而不是视图本身。

    【讨论】:

      【解决方案3】:

      您可以为整数或其他数字数据类型扩展函数

       namespace Utility
       {
            public static class Global
            {
                 public static string DecimalSepeartor(this int s)
                 {
                      NumberFormatInfo nfi = new CultureInfo("en-US", false).NumberFormat;
                      return (s.ToString("N", nfi));
                 }
            }
       }
      

      那么你可以像下面这样使用这个扩展功能

      @using Utility
      //
      //
      //
      
      <div> 
           @Model.Amount.DecimalSepeartor() 
      </div>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-20
        • 2021-12-09
        • 1970-01-01
        相关资源
        最近更新 更多