在.NET中格式化字符串的正确位置在哪里?

时间:2009-03-18 14:40:37

标签: .net vb.net

我们的数据库中有一个名为员工编号的字段。它是char(10)字段。我们正在存储正确的数字。所以我们将这些数字存储为" 1"" 2"等等。我不知道为什么我们开始这样做,因为它发生在我开始工作之前。

因此,业务逻辑中具有员工编号作为参数之一的每个功能都需要对数字进行右对齐。如果我们忘记了,它将无法正确更新数据库。

我的问题是:

有没有更好的方法来做到这一点,以便我们不必格式化每个函数中的数字?

8 个答案:

答案 0 :(得分:12)

停止在数据库中存储您的员工ID,并在您想要显示它们时将其取出。

编辑:员工编号应至少存储为varchar(10)(假设它可以接受非数字字符)或整数(如果它是实际的“数字”)它被认为是)。在检索到该号码后,如果有必要,您可以在显示它的任何应用程序中对其进行右对齐。

注意:我在评论中说过这一点,但需要明确说明:尝试解决潜在问题只会导致更多问题和整体混乱感在项目工作的不同开发人员中,将来会继承该项目。

答案 1 :(得分:2)

我不同意char数据类型的使用,但是要解决这个问题,一种方法是使用触发器。使用Integer表单中的数字更新一个表,然后使用触发器格式化它并将其存储在正确的表中。

同样,我只是重构数据类型,但听起来你无法做到这一点。

答案 2 :(得分:1)

即使这是一个不好的做法,因为其他人已发布,你不能从他们的员工类中公开一个只读属性,负责格式化

答案 3 :(得分:1)

我同意其他人认为重构是第一个建议。将员工ID存储为原始数据,并在视图级别执行需要正确理由的任何格式。

如果这绝对不是一个选项,我会在字符串上写一个扩展方法来处理这个问题。然后你可以存储someString.RightJustify(10)。扩展方法必须是静态类中的静态方法。以下内容可行:

public static class ExtensionMethods
{
    public static string RightJustify(this string s, int chars)
    {
        if (s.Length > chars)
            return s.Substring(0, chars);
        else
            return s.PadLeft(chars, ' ');
    }
}

答案 4 :(得分:0)

这取决于系统的架构。你有一个商业数据层使用?也许你可以在那里进行格式化?

我认为将DB更改为int或bigint是一个很大的重构,如果没有,那就这样做。

答案 5 :(得分:0)

您可能需要考虑一种扩展方法,该方法会扩展您的员工ID的(假定为)整数类型。

public static int ToRightAlignedString(this int obj)
{
    return ("          " + obj.ToString()).Right(10);
}

答案 6 :(得分:0)

您可以定义一个包含整数的类型(结构,最有可能),并在代码中使用该数字作为员工编号。像这样(C#)。

struct EmployeeNumber
{
    private int empNumber;

    public String EmpNum
    {
        set
        {
            int test;
            if (Int32.TryParse(value, out test))
            {
                empNumber = test;
            }
        }

        get
        {
            return empNumber.ToString("D10");
        }
    }
}

注意:我同意修复数据库是正确的事情。但是,我也知道该选项并不总是可用。在代码中使用自定义数据类型而不是int将是一种方便的方法,可以消除来回转换为数据库字符串的问题。

答案 7 :(得分:0)

Public Function foo(ByVal valToStore As Object) As String
    Dim RetVal As String = String.Empty
    If TypeOf valToStore Is String Then
        RetVal = DirectCast(valToStore, String)
    ElseIf TypeOf valToStore Is Integer Then
        RetVal = DirectCast(valToStore, Integer).ToString
    End If
    RetVal = RetVal.Trim.PadLeft(10, " "c)
    Return RetVal
End Function

我同意数据库应该将其存储为数字,而不是字符串。我猜测你想要一个VB答案。