定长字符串的问题

gui41021 2015-04-01 02:12:04
项目目前代码

dim a,b as string

a = "123456"

b = a '此时b为123456

------------

想要实现定长字符串自动截取功能

dim a as string
dim b as New Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString(5) ‘定义长度5的字符串

a = "123456"
b.value = a ' 此时 b.value = 12345

-----
但问题是这样做需要大量修改现行代码
如上面的方法,需要为每一个b赋值取值位置增加.value或者left或者substring什么的
,像这样的定长字符串用到了很多

可否从dim处入手做处理,不修改代码呢
目标:

dim a as string
dim b as 任何处理
任何处理

a = "123456"
b = a
得到b为 "12345"



...全文
609 38 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
本拉灯 2015-04-21
  • 打赏
  • 举报
回复
36楼,好牛B。。。膜拜
gui41021 2015-04-21
  • 打赏
  • 举报
回复
不明觉厉 还请大神指点迷津
office_2007 2015-04-15
  • 打赏
  • 举报
回复
使用字符串之前你们必须了解String类型的运行方式。然后,正确使用字符串。 我审阅了如上所有大神们的回答中看出,这些大神们没有弄清楚string的基本运行方式。 这种原因就转向了与string基本方式相违背的方向思考。 可悲啊! string类型是数据处理程序中非常重要的一部分。 例如;数据库连接。安全登陆,数据处理等等众多领域中都使用字符串。 微软为了数据安全的原因,对string类型进行了策略性运行方式。 一旦,对已经声明的字符串变量重新赋值时,字符串变量长度不可变的原因,就返回新的字符串变量, 不是原来的字符串变量。 为什么这样做呢? 为了防范更改字符串变量带来的安全隐患问题。 <<返回新的字符串变量的方式替代可变长度字符串变量。>> 这样你们已经基本上了解到了string类型的问题。 那么,关于解决楼主的问题你们应该明白了吗?!! 楼主提出的问题不是解决的问题,是举双手投降的方式结束走向与 string相违背的死路。! 阿门!
jthkl 2015-04-14
  • 打赏
  • 举报
回复
学习了。。。
本拉灯 2015-04-03
  • 打赏
  • 举报
回复
引用 29 楼 gui41021 的回复:
Dim a As digit= New digit(3) Dim b As String = "abcdefg" a = b 执行a = b时 执行了b 的string转digit Return New Digit(d) ' new后,len= 0,val = abcdefg 这样a = b过后,a 的len 就不再是设定的3,而是New Digit(d) 时没有传递的0
E。。。这个还没想到有这样的问题 。。。 Public Shared Widening Operator CType(ByVal d As String) As Digit Return New Digit(d) End Operator 这个方法是静太的,没法调用目标实体。。。你只能把那个Length也设成静太的了,不过这有缺陷,就是会变成全局的了。
gui41021 2015-04-03
  • 打赏
  • 举报
回复
Dim a As digit= New digit(3) Dim b As String = "abcdefg" a = b 执行a = b时 执行了b 的string转digit Return New Digit(d) ' new后,len= 0,val = abcdefg 这样a = b过后,a 的len 就不再是设定的3,而是New Digit(d) 时没有传递的0
本拉灯 2015-04-03
  • 打赏
  • 举报
回复
没懂你啥意思。
gui41021 2015-04-03
  • 打赏
  • 举报
回复
回楼上 a as digit(5) b as string = “123456” a = b时 因为new b为digit了 所以a 会被b 覆盖 为 长度0 123456
本拉灯 2015-04-03
  • 打赏
  • 举报
回复
引用 25 楼 gui41021 的回复:
d.val.Substring(0, 5) 帅哥,如果5想作为参数传入 那么dim a as digit(5) a = "123456789" 我如何把a 的长度作为参数传给 new ”123456789”的过程呢
那你就重载一个构造呀,


  ' Nested Types
    Private Class Digit
        ' Methods
        Public Length As Integer = 5
        ' Fields
        Public val As String

        Public Sub New(ByVal len As Integer)
            Length = len
        End Sub

        Public Sub New(ByVal d As String)
            Me.val = d
        End Sub

        Public Shared Widening Operator CType(ByVal d As String) As Digit
            Return New Digit(d)
        End Operator

        Public Shared Widening Operator CType(ByVal d As Digit) As String
            Return d.val.Substring(0, d.Length)
        End Operator

        Public Overrides Function ToString() As String
            Return Me.val.ToString
        End Function


      
    End Class
gui41021 2015-04-03
  • 打赏
  • 举报
回复
d.val.Substring(0, 5) 帅哥,如果5想作为参数传入 那么dim a as digit(5) a = "123456789" 我如何把a 的长度作为参数传给 new ”123456789”的过程呢
本拉灯 2015-04-03
  • 打赏
  • 举报
回复
引用 33 楼 gui41021 的回复:
我试了重载等号 不过貌似没效果
你是重载==号吧 赋值号是不能重载的。
gui41021 2015-04-03
  • 打赏
  • 举报
回复
我试了重载等号 不过貌似没效果
本拉灯 2015-04-03
  • 打赏
  • 举报
回复
引用 31 楼 gui41021 的回复:
那样的话 是不是 dim a as digit(3) dim b as digit(4) 结果 a 也会长为4
是的。这没法子了。要么你只能多写一行了 a="aaaaaaa1213" a.Length=6; 这样所以你自己看了。
gui41021 2015-04-03
  • 打赏
  • 举报
回复
那样的话 是不是 dim a as digit(3) dim b as digit(4) 结果 a 也会长为4
於黾 2015-04-02
  • 打赏
  • 举报
回复
引用 22 楼 dunewer 的回复:
有没有试过string.padleft这个函数?
这是作为补齐用的,不能用来截断 也就是说,字符串如果不满n个,则在左边补某个字符 但是如果已经超过n个了,你调用了也没效果的
本拉灯 2015-04-02
  • 打赏
  • 举报
回复
引用 21 楼 gui41021 的回复:
这段在VB里怎么写?


 ' Nested Types
        Private Class Digit
            ' Methods
            Public Sub New()
            End Sub

            Public Sub New(ByVal d As String)
                Me.val = d
            End Sub

            Public Shared Widening Operator CType(ByVal d As String) As Digit
                Return New Digit(d)
            End Operator

            Public Shared Widening Operator CType(ByVal d As Digit) As String
                Return d.val.Substring(0, 5)
            End Operator

            Public Overrides Function ToString() As String
                Return Me.val.ToString
            End Function


            ' Fields
            Public val As String
        End Class
dunewer 2015-04-02
  • 打赏
  • 举报
回复
有没有试过string.padleft这个函数?
gui41021 2015-04-02
  • 打赏
  • 举报
回复
引用 16 楼 wyd1520 的回复:
这样就能做到最小修改了

 class Digit
        {
            public Digit()
            {
               
            }

            public Digit(string d)
            { 
                val = d; 
            }
            public string val;


            // User-defined conversion from Digit to double
            public static implicit operator string(Digit d)
            {
                return d.val.Substring(0, 5);
            }
            //  User-defined conversion from double to Digit
            public static implicit operator Digit(string d)
            {
                return new Digit(d);
            }
        }
  Digit dig = new Digit();
            dig = "abcdefghijk";
            //This call invokes the implicit "double" operator
            string num = dig;
            //This call invokes the implicit "Digit" operator
            Digit dig2 = "abcdefgaefe";
            Console.WriteLine("num = {0} dig2 = {1}", num, dig2.val);
            Console.ReadLine();
public static implicit operator string(Digit d) { return d.val.Substring(0, 5); } 这段在VB里怎么写?
gui41021 2015-04-01
  • 打赏
  • 举报
回复
引用 19 楼 Z65443344 的回复:
不管用什么方式,你也得找到所有需要截断的字符串,一个一个的改的 因为你的项目里必然是有字符串不需要截断的,而不是所有字符串都要截断 比如数据库连接字符串,你截断了还得了 比如JSON数据字符串 等等
是的 虽然是一部分 量也不小呢 所以才考虑只改定义 不进代码
於黾 2015-04-01
  • 打赏
  • 举报
回复
不管用什么方式,你也得找到所有需要截断的字符串,一个一个的改的 因为你的项目里必然是有字符串不需要截断的,而不是所有字符串都要截断 比如数据库连接字符串,你截断了还得了 比如JSON数据字符串 等等
加载更多回复(17)

16,721

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧