如何改变中文数字排序?

时间:2021-08-04 06:55:29
例如表:

月份
一月
二月
三月
四月
五月
六月
七月
八月
九月
十月
十一月
十二月

如果 select 月份 from 表 order by 月份,结果如下:

月份
八月
二月
九月
六月
七月
三月
十二月
十一月
十月
四月
五月
一月

按拼音排了序。
vfp支持不支持中文按数值排序?或者象excel那样、自定义序列?

16 个解决方案

#1


另加一个编号列,然后按编号排序。

#2


不能用辅助列。

我现在在研究vfp自带的一段代码 vfpxtab.prg,把线形表转换为交叉表,排序是由它自动完成的,没法用上辅助列。

#3


干脆去掉
order by 月份

#4


哈哈,抱歉,没说清,"月份"是字段名。

关键是月份不按数值排序。

#5


中文月份改为数字月份
月份
一月    1
二月    2



十二月 12
月份字段设为数值型不就行了,要会变通。
还有一种方法:月份改为数字后,用CAST()转换为数值型。参照VFP9.0帮助文件
SELECT CAST(月份 as n(6)) from 表 order by 月份

#6


repl 月份 with '01' all for 月份='一月'
repl 月份 with '02' all for 月份='二月'
repl 月份 with '03' all for 月份='三月'
repl 月份 with '04' all for 月份='四月'
repl 月份 with '05' all for 月份='五月'
repl 月份 with '06' all for 月份='六月'
repl 月份 with '07' all for 月份='七月'
repl 月份 with '08' all for 月份='八月'
repl 月份 with '09' all for 月份='九月'
repl 月份 with '10' all for 月份='十月'
repl 月份 with '11' all for 月份='十一月'
repl 月份 with '12' all for 月份='十二月'




#7


我的问题是:
vfp支持不支持中文按数值排序?或者象excel那样、自定义序列?

而不是有没有办法排序。

你这是有办法排序,但不是“vfp支持中文按数值排序”

我要把一个月份序列传给另一段代码处理,这段代码只接受我示例中的字符序列,而且是别人编的,我没法改。

引用 5 楼 lygcw9602 的回复:
中文月份改为数字月份
月份
一月 1
二月 2



十二月 12
月份字段设为数值型不就行了,要会变通。
还有一种方法:月份改为数字后,用CAST()转换为数值型。参照VFP9.0帮助文件
SELECT CAST(月份 as n(6)) from 表 order by 月份

#8


不知道VFP能不能增加自定义序列!
好像VFP也不能按中文数字排序!

不过可以变通一下:

select 月份,ATC(LEFTc(月份,2),"一月二月三月四月五月六月七月八月九月十月十一十二") as px from 表 order BY px

这样就相当自定义了一个序列,虽然表中多了一个PX列,但可以不理嘛!

#9



估计是做不到了,算了,结贴,散分。

#10


select 月份,ATC(LEFTc(月份,2),"一月二月三月四月五月六月七月八月九月十月十一十二") as px from 表 order BY px

这句可以呀!我试过了

#11


引用 10 楼 ilovevf 的回复:
select 月份,ATC(LEFTc(月份,2),"一月二月三月四月五月六月七月八月九月十月十一十二") as px from 表 order BY px

这句可以呀!我试过了


我的目的不是为了排序,排序肯定有办法做到。

我的问题时“vfp支持不支持中文按数值排序?或者象excel那样、自定义序列?”
放这个序列上来,主要还是便于大家理解我所说的按中文排序。
我要把这样类似的一个序列传递给另外一段代码,由它去排序。这段代码不是我编的,我没法去改代码。而且这段代码又不接受纯数字,传数字给它,它自动转换成文字再去排序。结果还是不对。

所以只好考虑能不能改变VFP的排序规则。

再次多谢了!






#12


自定义函数呀

select 月份 from 表 order by myorder(月份)

FUNCTION myorder(v)
DIMENSION dict[12]
dict[1] = '一月'
dict[2] = '二月'
dict[3] = '三月'
dict[4] = '四月'
dict[5] = '五月'
dict[6] = '六月'
dict[7] = '七月'
dict[8] = '八月'
dict[9] = '九月'
dict[10] = '十月'
dict[11] = '十一月'
dict[12] = '十二月'

RETURN ASCAN(dict, ALLTRIM(v))
END FUNC

#13


    只要是VFP做的程序,一般没有改不了的,况且楼主说程序是别人做的,你改不了,但却需要VFP支持这样的排序规则就可以解决问题!
     那我的理解就是:这个程序只是一个没编译或者只是编译成VFP的APP程序。
如果是没编译的,那改不了就说不过去,如果只是编译成APP了,那也很容易进行修改!

如果是编译成EXE的,那就算VFP10出来了并支持这种排序规则,你也用不了不是!

所以我觉得,你可能只是没搞明白别人做的程序的算法而无从改起,或者你有别的目的!

至于说VFP支持什么样的排序规则,那就只有三种:pinyin,stroke,machine
至于说支持不支持“中文按数值排序”,那除非你把中文全转成数值,或者把数值能转成中文这问题就不是问题了,但通常中文不是数值,而你又不让给中文编码,那结果就是中文和数值没关系,也就不能“按”了
至于说象excel那样、自定义序列这个当然能办到了,就算是excel,它也不过是把给定序列进行编码再排序,难道excel能认识中文不成!

我的结论是:自己牙疼应该研究自己牙的事,别去折腾人家火星人有牙没有牙!

#14


该回复于2012-02-21 09:15:41被版主删除

#15


引用 13 楼 lc_apple 的回复:
只要是VFP做的程序,一般没有改不了的,况且楼主说程序是别人做的,你改不了,但却需要VFP支持这样的排序规则就可以解决问题!
  那我的理解就是:这个程序只是一个没编译或者只是编译成VFP的APP程序。
如果是没编译的,那改不了就说不过去,如果只是编译成APP了,那也很容易进行修改!

如果是编译成EXE的,那就算VFP10出来了并支持这种排序规则,你也用不了不是!

所以我觉得,你可……


说的好,变通是硬道理。

#16


楼主vfp支持不支持中文按数值排序;也不支持英文数值排序的

比如

oct
dec
may
june
march

能排吗?? 这种方法好像内那种语言能排得了,  好像只有PHP 有个自然数排序法 最多能把2排在11前面

你要想解决问题有很多种途径
比如
10_oct
12_dec
05_may
06_june
03_march

这样就能排了,  传给他的东西有你决定。。。。

#1


另加一个编号列,然后按编号排序。

#2


不能用辅助列。

我现在在研究vfp自带的一段代码 vfpxtab.prg,把线形表转换为交叉表,排序是由它自动完成的,没法用上辅助列。

#3


干脆去掉
order by 月份

#4


哈哈,抱歉,没说清,"月份"是字段名。

关键是月份不按数值排序。

#5


中文月份改为数字月份
月份
一月    1
二月    2



十二月 12
月份字段设为数值型不就行了,要会变通。
还有一种方法:月份改为数字后,用CAST()转换为数值型。参照VFP9.0帮助文件
SELECT CAST(月份 as n(6)) from 表 order by 月份

#6


repl 月份 with '01' all for 月份='一月'
repl 月份 with '02' all for 月份='二月'
repl 月份 with '03' all for 月份='三月'
repl 月份 with '04' all for 月份='四月'
repl 月份 with '05' all for 月份='五月'
repl 月份 with '06' all for 月份='六月'
repl 月份 with '07' all for 月份='七月'
repl 月份 with '08' all for 月份='八月'
repl 月份 with '09' all for 月份='九月'
repl 月份 with '10' all for 月份='十月'
repl 月份 with '11' all for 月份='十一月'
repl 月份 with '12' all for 月份='十二月'




#7


我的问题是:
vfp支持不支持中文按数值排序?或者象excel那样、自定义序列?

而不是有没有办法排序。

你这是有办法排序,但不是“vfp支持中文按数值排序”

我要把一个月份序列传给另一段代码处理,这段代码只接受我示例中的字符序列,而且是别人编的,我没法改。

引用 5 楼 lygcw9602 的回复:
中文月份改为数字月份
月份
一月 1
二月 2



十二月 12
月份字段设为数值型不就行了,要会变通。
还有一种方法:月份改为数字后,用CAST()转换为数值型。参照VFP9.0帮助文件
SELECT CAST(月份 as n(6)) from 表 order by 月份

#8


不知道VFP能不能增加自定义序列!
好像VFP也不能按中文数字排序!

不过可以变通一下:

select 月份,ATC(LEFTc(月份,2),"一月二月三月四月五月六月七月八月九月十月十一十二") as px from 表 order BY px

这样就相当自定义了一个序列,虽然表中多了一个PX列,但可以不理嘛!

#9



估计是做不到了,算了,结贴,散分。

#10


select 月份,ATC(LEFTc(月份,2),"一月二月三月四月五月六月七月八月九月十月十一十二") as px from 表 order BY px

这句可以呀!我试过了

#11


引用 10 楼 ilovevf 的回复:
select 月份,ATC(LEFTc(月份,2),"一月二月三月四月五月六月七月八月九月十月十一十二") as px from 表 order BY px

这句可以呀!我试过了


我的目的不是为了排序,排序肯定有办法做到。

我的问题时“vfp支持不支持中文按数值排序?或者象excel那样、自定义序列?”
放这个序列上来,主要还是便于大家理解我所说的按中文排序。
我要把这样类似的一个序列传递给另外一段代码,由它去排序。这段代码不是我编的,我没法去改代码。而且这段代码又不接受纯数字,传数字给它,它自动转换成文字再去排序。结果还是不对。

所以只好考虑能不能改变VFP的排序规则。

再次多谢了!






#12


自定义函数呀

select 月份 from 表 order by myorder(月份)

FUNCTION myorder(v)
DIMENSION dict[12]
dict[1] = '一月'
dict[2] = '二月'
dict[3] = '三月'
dict[4] = '四月'
dict[5] = '五月'
dict[6] = '六月'
dict[7] = '七月'
dict[8] = '八月'
dict[9] = '九月'
dict[10] = '十月'
dict[11] = '十一月'
dict[12] = '十二月'

RETURN ASCAN(dict, ALLTRIM(v))
END FUNC

#13


    只要是VFP做的程序,一般没有改不了的,况且楼主说程序是别人做的,你改不了,但却需要VFP支持这样的排序规则就可以解决问题!
     那我的理解就是:这个程序只是一个没编译或者只是编译成VFP的APP程序。
如果是没编译的,那改不了就说不过去,如果只是编译成APP了,那也很容易进行修改!

如果是编译成EXE的,那就算VFP10出来了并支持这种排序规则,你也用不了不是!

所以我觉得,你可能只是没搞明白别人做的程序的算法而无从改起,或者你有别的目的!

至于说VFP支持什么样的排序规则,那就只有三种:pinyin,stroke,machine
至于说支持不支持“中文按数值排序”,那除非你把中文全转成数值,或者把数值能转成中文这问题就不是问题了,但通常中文不是数值,而你又不让给中文编码,那结果就是中文和数值没关系,也就不能“按”了
至于说象excel那样、自定义序列这个当然能办到了,就算是excel,它也不过是把给定序列进行编码再排序,难道excel能认识中文不成!

我的结论是:自己牙疼应该研究自己牙的事,别去折腾人家火星人有牙没有牙!

#14


该回复于2012-02-21 09:15:41被版主删除

#15


引用 13 楼 lc_apple 的回复:
只要是VFP做的程序,一般没有改不了的,况且楼主说程序是别人做的,你改不了,但却需要VFP支持这样的排序规则就可以解决问题!
  那我的理解就是:这个程序只是一个没编译或者只是编译成VFP的APP程序。
如果是没编译的,那改不了就说不过去,如果只是编译成APP了,那也很容易进行修改!

如果是编译成EXE的,那就算VFP10出来了并支持这种排序规则,你也用不了不是!

所以我觉得,你可……


说的好,变通是硬道理。

#16


楼主vfp支持不支持中文按数值排序;也不支持英文数值排序的

比如

oct
dec
may
june
march

能排吗?? 这种方法好像内那种语言能排得了,  好像只有PHP 有个自然数排序法 最多能把2排在11前面

你要想解决问题有很多种途径
比如
10_oct
12_dec
05_may
06_june
03_march

这样就能排了,  传给他的东西有你决定。。。。