【问题标题】:My PadRight() isn't working - Visual Basic我的 PadRight() 不工作 - Visual Basic
【发布时间】:2016-11-08 13:45:09
【问题描述】:

我正在尝试从 Microsoft SQL 数据库中检索我的记录并将其写入 .txt 文件。我的代码工作正常,但 PadRight() 没有。

我的问题是:为什么我的 PadRight() 不起作用? *即使我将 PadRight() 放在其他列名中,它仍然无法正常工作。

输出:如果我输入 row("ProcessDate".PadRight(9)) 它应该只显示 6 个字符的值而不是整个值。

例如:如果 Microsoft SQL 数据库中 ProcessDate 的值是 2016 年 11 月 8 日 31342 输出应该是:11/8/2016

我的代码:

 For Each row As DataRow In table.Rows
    swMonetary.WriteLine(String.Format("{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}",
        row("ProcessDate".PadRight(6)), 
        row("SubscriberAccountNumber"), 
        row("PayorName"), 
        row("ParNumber"), 
        row("MemberType"), 
        row("ApplicablePeriodStart"), 
        row("ApplicablePeriodEnd"), 
        row("TransactionAmount"), 
        row("PaymentType"), 
        row("CheckNo")))
    count += 1
Next

【问题讨论】:

  • 这不是String.PadRight() 所做的。你想使用String.Substring()
  • 这也不是 Padright 的工作方式 - 您正在填充文字“ProcessDate”而不是它所持有的值:row("ProcessDate").ToString().PadRight(6)
  • 如果是 DateTime 列,使用这种方式格式化结果:Convert.ToDateTime(row("ProcessDate")).ToString("dd/MM/yyyy")
  • 此外,该格式的某些日期长度为 10 个字符 - 例如“12/12/2016”。
  • 其他不是日期格式的呢?那实际上是字符串格式吗? @ChrisF

标签: .net vb.net visual-studio


【解决方案1】:

PadRight 方法可以在字符串中对齐和添加空格(默认情况下)。 如果总宽度小于字符串长度,它将返回对原始字符串的引用。 所以,它不会缩短你的字符串。 我建议你看看Substring 方法。

正如 ChrisF 在 cmets 中提到的,Substring 解决方案只能部分解决问题。

如果row("ProcessDate") 肯定会始终为您提供有效日期,您只需更改"{0:dd/MM/yyyy}{1}{2}{3}{4}{5}{6}{7}{8}{9}" 的格式字符串即可。

如果可以是Nothing,有很多方法可以解决这个问题,我发一个。

For Each row As DataRow In table.Rows
    Dim dt As DateTime
    Dim finalValue As String = If(DateTime.TryParse(row("ProcessDate"), dt), dt.ToString("dd/MM/yyyy"), "Default value")

    swMonetary.WriteLine(String.Format("{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}",
        finalValue, 
        row("SubscriberAccountNumber"), 
        row("PayorName"), 
        row("ParNumber"), 
        row("MemberType"), 
        row("ApplicablePeriodStart"), 
        row("ApplicablePeriodEnd"), 
        row("TransactionAmount"), 
        row("PaymentType"), 
        row("CheckNo")))
    count += 1
Next
  • 如果数据库在日期行中返回 Nothing,此解决方案会小心。
  • 还记得将“dd/MM/yyyy”更改为适合您需要的格式字符串。
  • 还有默认值的“默认值”:),可能是 String.Empty。

【讨论】:

  • 这里唯一的问题是 Substring(0, 9) 会截断像“12/12/2016”这样的日期
  • 嗨@PauloJunior,其他人怎么样?我不仅关注 ProcessDate 表,我还对“PaymentType”等其他表非常感兴趣
  • 您可以对其他人使用几乎相同的方法,如果是日期或小数,您可以尝试解析,就像我显示的日期一样。如果它是一个字符串,请尝试我们已经讨论过的 Substring 方法。我将提供的这个链接可以真正帮助您格式化标准(msdn.microsoft.com/en-us/library/dwhawy9k(v=vs.110).aspx)或自定义数字格式字符串,如果需要,您还可以找到有关如何格式化日期或枚举的信息。如果您在格式化其他字段方面仍然需要任何帮助,请向我们提供有关您真正想要的结果的更多信息,也许是示例。
【解决方案2】:
For Each row As DataRow In table.Rows
            Dim dt As DateTime
            Dim finalValue As String = If(DateTime.TryParse(row("ProcessDate"), dt), dt.ToString("dd/MM/yyyy"), "Default value")
            Dim SubscriberNumber As String = row("SubscriberAccountNumber")
            Dim PayorName As String = row("PayorName")
            Dim ParNumber As String = row("ParNumber")
            Dim MemberType As String = row("MemberType")
            Dim Start As String = row("ApplicablePeriodStart")
            Dim Ends As String = row("ApplicablePeriodEnd")
            Dim Amount As String = Convert.ToDouble(row("TransactionAmount"))
            Dim PaymentType As String = row("PaymentType")
            Dim CheckNo As String = row("CheckNo")
            swMonetary.WriteLine(String.Format("{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}", finalValue.PadRight(15), SubscriberNumber.PadRight(20), PayorName.PadRight(30), ParNumber.PadRight(20), MemberType.PadRight(20), Start.PadRight(6), Ends.PadRight(6), Amount.PadRight(15), PaymentType.PadRight(10), CheckNo.PadRight(25)))
            count += 1
        Next

我找到了另一个解决方案。 =)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 2014-07-11
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多