搜档网
当前位置:搜档网 › C语言-获取一个字符串中的数字组

C语言-获取一个字符串中的数字组

C语言-获取一个字符串中的数字组
C语言-获取一个字符串中的数字组

输入一个字符串,内有数字和非数字字符,例如:

a123x456 17960?302tab5876

将其中连续的数字作为一个整数,依次存放到数组a中,例如123存放在

a[0],456存放在a[1]........统计共有多少个整数,并输出这些整数。

这个程序的关键有两个问题:

Q1. 如何发现连续的数字序列。

Q2. 如何把这些数字队列整合成整数存储起来。

对于Q1,判断数字序列的方法就是,当指针指向的一个元素是数字,(即处在‘0’和'9'之间的字符)的时候开始记数,如果下一个仍然是数字,那么记数flag(在程序中为j)自加。若下一个元素不是数字,那么判断当前记数flag 是不是大于0(即至少有一位),如果记数flag大于0的话。那么问题就转向了Q2,即一个完整的数字序列如何转换成一个整数。

Q2的问题其实单拿出来是很简单的,就是输入一个只含有数字的字符串,如“7589”,怎样把它转换成一个整形数7889,

具体算法是这样的:

首先得到“7589”这个字符串的长度,为4.

7589=7*1000+5*100+8*10+9;

这里采用自加的方法:

7处在第4位上,乘数因子是10*(4-1);

5处在第3位上,乘数因子是10*(3-1);

.......

/**其实这个问题扩展一下还可以做一个问题就是倒序输出,给“123456”输出“654321”这种问题。*/

所以问题就被一步步简化了。

题目虽然很简单,但要学习这种结构化的思路以及层层简化问题的方法。

另外需要考虑到的一个问题就是如果字符串以数字结尾,那么记数flag就会一直自加,直到到达字符串最后一位跳出循环,但却没有执行数字序列转整形数的操作,所以,需要在跳出循环时,判断当前的记数元素是不是大于0,从而将最后一个数字序列转换成为整形数。

附源代码如下:

1. #include

2. void main(){

3. char s[100]={};

4. int a[20];

5. char *pstr;

6. int *pa;

7. int i=0,j=0;

8. int k,m;

9. int e10;

10. int digit;

11. int ndigit=0;

12.

13. printf("Input a string:\n");

14. scanf("%s",s);

15.

16. pstr=&s[0];

17. pa=&a[0];

18.

19. for(i=0;*(pstr+i)!='\0';i++){

20. if((*(pstr+i)>='0')&&(*(pstr+i)<='9'))

21. j++;

22. else{

23. if(j>0){

24. digit=*(pstr+i-1)-48;

25. for(k=1;k

26. e10=1;

27. for(m=1;m<=k;m++)

28. e10=e10*10;

29. digit=digit+(*(pstr+i-1-k)-48)*e10;

30. }

31. *pa=digit;

32. ndigit++;

33. pa++;

34. j=0;

35. }

37. }

38.

39. if(j>0){

40. digit=*(pstr+i-1)-48;

41. k=1;

42. e10=1;

43. while(k

44. for(m=1;m<=k;m++)

45. e10*=10;

46. digit+=(*(pstr+i-1-k)-48)*e10;

47. k++;

48. }

49. *pa=digit;

50. ndigit++;

51. j=0;

52. }

53.

54. printf("There are %d numbers in this line. They are:\n",ndigit);

55. j=0;

56. pa=&a[0];

57.

58. for(j=0;j

59. printf("%d\t",*(pa+j));

60. }

61. printf("\n");

62.

e x c e l中个单元格中有文字字母字符和数字如何能把数字单独提取出 来提取数字 集团标准化办公室:[VV986T-J682P28-JP266L8-68PNN]

excel中一个单元格中有文字字母字符和数字如何能把数字单独提取出来2011-04-13 11:25匿名|分类:|浏览1375次 如A1中 A本月电费收入(美兰供电所)(对帐标志: 想在B中表示为 最好能教一个方法十分感谢 我有更好的答案 按默认排序| 2条回答 |2011-04-13 11:32|十五级 在EXECL理,按ALT+F11,插入-模块,复制下列语句 Function SplitNumEng(str As String, sty As Byte) Dim StrA As String Dim StrB As String Dim StrC As String Dim i As Integer Dim SigS As String For i = 1 To Len(str) SigS = Mid(str, i, 1) If SigS Like "[a-zA-Z]" Then

StrA = StrA & SigS ElseIf SigS Like "#" Then StrB = StrB & SigS Else StrC = StrC & SigS End If Next i Select Case sty Case 1 SplitNumEng = StrA Case 2 SplitNumEng = StrB Case Else SplitNumEng = StrC End Select End Function 比如你的数据在A1 BI输入 =SplitNumEng(A1,1) 表示提取字母 =SplitNumEng(A1,2) 表示提取数字

excel中取出字符串中的数字 1.数据- "a12345y" 如何自动撷取其中的数字 2.数据- "12345" 如何自动只撷取其中间三个的数位(即234)放於其它格上 如果你的数据有固定的长度和格式,公式可以简单些,如,前后各有1位字母: A1="a12345y" B1=Mid(A1,2,5) 如果前后字母个数不固定: B1=MID(A1,MA TCH(0,0*MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1),),MATCH(0,0*MID(A1,ROW(IN DIRECT("1:"&LEN(A1))),1))-MATCH(0,0*MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1),)+1) 数组公式,按Ctrl+Shift+Enter三键结束。 1、截取字符串中的一部分,用函数MID()。 A1="a12345y" 公式最外层是Mid()函数,该函数的格式是: Mid(文本,开始位置,长度) 对应公式是: MID(A1,MATCH(0,0*MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1),),MATCH(0,0*MID(A1,ROW(INDIR ECT("1:"&LEN(A1))),1))-MATCH(0,0*MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1),)+1) 2、长度=末位置-首位置+1。 其中MATCH()公式有不同的两个: 文本A1中第1个数字所在的位置:MATCH(0,0*MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1),) 文本A1中最后1个数字所在的位置:MATCH(0,0*MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1)) 两个公式不同之处,在于最后一个逗号。公式什么意思先别管,你只要知道: 长度=最后1个数字的位置-第1个数字的位置+1 本例中:6-2+1=5,数字长度为5。 3、拆散字符串。 下面公式取出字符串中的每一粒字符: MID(A1,1,1)="a" MID(A1,2,1)="1" …… MID(A1,6,1)="5" MID(A1,7,1)="y" 下面公式返回的是拆散后的一串字符(数组): MID(A1,{1;2;3;4;5;6;7},1)={"a";"1";"2";"3";"4";"5";"y"} 其中{1;2;3;4;5;6;7}用ROW(INDIRECT("1:"&LEN(A1)))计算所得。 这是数组公式中的一个基本技巧,如果还不懂,请从固顶的帖子中找到并学习它。 在编辑栏中,请用鼠标选取MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1) 然后按F9可以看到上面的结果。 4、0乘以任何数都得0吗? 你一定不会怀疑。 还是在编辑栏,请继续用鼠标选择: 0*{"a";"1";"2";"3";"4";"5";"y"},或者选择: 0*MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1),按F9,结果显示为: {#VALUE!;0;0;0;0;0;#VALUE!}。真的不是“都得0”。 里面除了0,还有错误值。个数与原来数组元素的个数相同。

一、单元格A1中有如下内容:要提取出数字 经测试下列公式好用 提取Excel单元格中连续的数字的函数公式是: =LOOKUP(9E+307,--MID(A1,MIN(FIND({1,2,3,4,5,6,7,8,9,0},A1&1234567890)),ROW($1:$8))) 或者 =LOOKUP(9E+307,--MID(H2,MIN(FIND({0;1;2;3;4;5;6;7;8;9},H2&1234567890)),ROW(INDIRECT("1:"&LEN(H2))))) 解释一下这个公式 FIND函数——查询文本所在位置 FIND(find_text,within_text,[start_num]) FIND(需查找的文本,包含查找文本的单元格,开始查找单元格的字符位置(可选)) 此处FIND函数是搜索{1,2,3,4,5,6,7,8,9,0}数字在“A1&1234567890”中所在的位置; A1&1234567890的目的是在用FIND函数查询时,不出现错误值,使之后的MIN函数可以正常运行。 即FIND({1,2,3,4,5,6,7,8,9,0},“小王联系电话58670098负责财务1234567890”) 选取划黑后按F9,得出的位置为:{19,20,21,22,7,9,10,8,13,11} MIN函数——返回列表中的最小值 MIN(number1,number2,……) MIN(数字1,数字2,……)

将FIND所得结果{19,20,21,22,7,9,10,8,13,11}带入MIN函数,最小值所得为7,正是第一个数值出现的位置; 也正是之前FIND函数中使用A1&1234567890的原因。 MID函数——返回文本字符串从指定位置开始特定数目的字符,即提取某段字符。 MID(text,start_num,num_chars) MID(被提取的文本或单元格,开始提取的字符位置,提取的字符个数) 将上述MIN函数所得带入MID(A1,7,ROW($1:$8); ROW($1:$8)使用row函数不是用来计算行,而是借用其作为常量。当然1:8是可以修改的,只要大于数值个数就不影响结果。 --MID(……)中“--”的作用是将MID得出的结果变为数值,使其可以被LOOKUP函数查询到。 MID(……)选取划黑后按F9{"5";"58";"586";"5867";"58670";"586700";"5867009";"58670098"} --MID(……)选取划黑后按F9{5;58;586;5867;58670;586700;5867009;58670098} LOOKUP函数——从返回某个查询的值(数组形式) LOOKUP(lookup_value,array) LOOKUP(在数组中查找的值,数组范围区域)

在A1单元格里数组为1+10-20在B1单元格里数组为-2+55-122 ;请问如何把 A1和B1单格里正负数各自提取求和,如这样,提取A1 单元与B1的数字,1、10、55在C1求和。提取-20、-2、-122在D1求和,求这两个公式,请指教! 你可以直接 copy 这几个公式 C1: =SUMIF(D3:D11,">0") D1: =SUMIF(D3:D11,"<0") C2: =SUBSTITUTE(SUBSTITUTE(IF(LEFT(A1,1)="-",0&A1,A1)&IF(LEFT(B1,1)="-",B1,"+"&B1),"+",","),"-",",-")&"," C4: =FIND(",",C$2,C3+1) D3: =VALUE(MID($C$2,C3+1,C4-C3-1)) 甚至可以适用于类似 3+12-45+32+2 和 8-9-111+6 等复杂情况。 如果你非得用一个函数实现(不用任何辅助单元格),需要用VB。 补充回答: VB 方法如下, 在Excel里,同时按Alt和F11,进入VB界面,右键点左上窗口的 Thisworkbook,插入,模块,在右边窗口粘贴如下代码: Function SumP(Range1 As Range, Range2 As Range) As Long Dim i, j As Byte Dim tmp As String SumP = 0 j = 1 tmp = IIf(Left(Range1, 1) = "-", Range1, " " & Range1) & IIf(Left(Range2, 1) = "-", Range2, "+" & Range2) & " " tmp = Replace(tmp, "-", " -") tmp = Replace(tmp, "+", " ") For i = 1 To Len(tmp) - Len(Replace(tmp, " ", "")) - 1 If CLng(Trim(Mid(Left(tmp, InStr(j + 1, tmp, " ") - 1), j + 1, 10))) > 0 Then SumP= SumP+ CLng(Trim(Mid(Left(tmp, + 1, tmp, " ") - 1), j + 1, 10))) j = InStr(j + 1, tmp, " ") Next i End Function Function SumN(Range1 As Range, Range2 As Range) As Long Dim i, j As Byte Dim tmp As String SumN = 0 j = 1 tmp = IIf(Left(Range1, 1) = "-", Range1, " " & Range1) & IIf(Left(Range2, 1) = "-", Range2, "+" & Range2) & " " tmp = Replace(tmp, "-", " -") tmp = Replace(tmp, "+", " ") For i = 1 To Len(tmp) - Len(Replace(tmp, " ", "")) - 1 If CLng(Trim(Mid(Left(tmp, InStr(j + 1, tmp, " ") - 1), j + 1, 10))) < 0 Then SumN= SumN+ CLng(Trim(Mid(Left(tmp, + 1, tmp, " ") - 1), j + 1, 10))) j = InStr(j + 1, tmp, " ") Next i End Function 会到 Excel 里,在 C1 输入 =sump(a1,b1) ,在 D1 输入 =sumn(a1,b1)InStr(j InStr(j

excel中一个单元格中有文字字母字符和数字如何能把数字单独提取出来?2011-04-13 11:25匿名?|?分类:办公软件?|?浏览1375次 如A1中 A本月电费收入(美兰供电所)(对帐标志:2010.01.07) 想在B中表示为 20100107 最好能教一个方法十分感谢 我有更好的答案 按默认排序|按时间排序 2条回答 检举|2011-04-13 11:32Mrpine|十五级 在EXECL理,按ALT+F11,插入-模块,复制下列语句 Function SplitNumEng(str As String, sty As Byte) Dim StrA As String Dim StrB As String Dim StrC As String Dim i As Integer Dim SigS As String For i = 1 To Len(str) SigS = Mid(str, i, 1) If SigS Like "[a-zA-Z]" Then

StrA = StrA & SigS ElseIf SigS Like "#" Then StrB = StrB & SigS Else StrC = StrC & SigS End If Next i Select Case sty Case 1 SplitNumEng = StrA Case 2 SplitNumEng = StrB Case Else SplitNumEng = StrC End Select End Function 比如你的数据在A1 BI输入 =SplitNumEng(A1,1) 表示提取字母 =SplitNumEng(A1,2) 表示提取数字

EXCEL中从一个字符串里提取连续数字引发的思考(二) 从一个字符串中提取连续数字的函数 =LOOKUP(9E+307,--MID(A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},A1&"0123456789")),RO W(INDIRECT("$1:$"&LEN(A1)))))引发的思考(二) 依然假设A1=“总人口7895432个”,A列的内容都是这种形式的,你的任务就是把其中的数字单独提取出来放到B列。以B1单元格为例: 在上一篇中,使用LOOKUP的框架中会使用到MID,思路还显得很曲折和原始,那么可否就直接以MID为框架来提取数字呢?答案是肯定的,思路也比较简洁,尽管使用起来看似复杂,像下面这样写。 =1*MID(A1,MATCH(TRUE,ISNUMBER(1*MID(A1,ROW(INDIRECT("$A1:$"&"A"&LEN (A1))),1)),0),COUNT(1*MID(A1,ROW(INDIRECT("$A1:$"&"A"&LEN(A1))),1))) 接上篇,讲解之前有必要先来认识下ROW和COLUMN函数,这是取行号和列号的函数,那么其参数必须是引用(单元格、行或列)。比如ROW(C1)=1,COLUMN(C1)=3。将参数里的单一单元格变成单元格矩阵的话,就会返回一个数组,比如ROW(A1:A5)={1;2;3;4;5},按Ctrl+shift+enter结束输入就会看到公式被{}括起来了,说明是一个数组,而单元格里只显示数组的第一个。

常见的懒人写法ROW(1:100)只写了行号,简直是一种赤裸裸的浪费计算资源的写法,从A 到Z有26列,然后AA到AZ、BA到BZ......这样排列组合下来得有26^26种组合了,计算了多少次啊!简直瞎搞嘛,取个行号而已,大可以写成ROW(A1:A100)或ROW(B1:B100)等等简单明了,按需计算100次而已。 所以,在此篇中,ROW(INDIRECT ("$1:$"&LEN(A1))) 升级成 ROW(INDIRECT("$A1:$"&"A"&LEN(A1)))以减轻计算机负荷。 说到正题,用ROW按字符串长度生成一个序列,为什么要用 ROW(INDIRECT("$A1:$"&"A"&LEN(A1))) ,而不能想当然的直接写ROW($1:$LEN(A1))?因为ROW函数的参数必须是引用!静态的写法ROW(1:100)或ROW(A1:A100)是引用,加了LEN函数就变成动态的了,需要间接引用函数Indirect、Offset或Index来帮忙。 一般常见的是组合Indirect的写法,用法就像C语言里的指针一样。在静态写法INDIRECT(A1:A3)下,假设A1单元格的内容是B3,A2单元格内容是"哇哈哈",A3为空,而B3单元格内容是"我靠",则INDIRECT(A1:A3)={"我靠";#REF!;#REF!}。如果加入LEN 函数变成动态的,而且以单元格("A1":"A3")的形式作参数,不会返回单元格的引用值,而是直接返回单元格内容,INDIRECT("$A1:$"&"A"&LEN(A2))={"B3";"哇哈哈";0}。 因为Row和Column可以引用自身,所以Row、Column套任何函数以后,仍然可以引用自身,但Indirect却不行,所以如果直接写Indirect("1:10"),那么公式不能写在1至10

Excel提取文本中数字公式 第一种,如图,如果数字在中文的后面,那么使用公式:"=--RIGHT(A2,LEN(A2) *2-LENB(A2))"解释下:因为中文字符是占两个字节。而数字占一个字节。len 返回值是字符的个数。而lenb返回值是这个字符串占多少个字节。所以,这两个的差值就是一个有几个中文。LENB(A2)-LEN(A2) = 中文实际个数字符总数-中文个数=数字个数LEN(A2)-(LENB(A2)-LEN(A2) )=数字个数开括号数字个数=LEN(A2)*2-LENB(A2)。因为数字在右边,所以,利用RIGHT,获取从右边第一个开始到最后一个数字,就得到这个数值。 第二种:数字在中文的前面。实际上和第一种的方法是一样的,这儿只是取数字的时候,从左边开始。公式: "=--LEFT(A2,LEN(A2)*2-LENB(A2))" 第三种:混搭。这个其实就是加个判断,判断第一个字符是数字还是中文。如果是数字,那么就用上面的第二个公式,中文就用第一个公式。公式:“=IF(ISN UMBER(--LEFT(A2,1)),--RIGHT(A2,LEN(A2)*2-LENB(A2)),--LEFT(A2,LEN(A2)* 2-LENB(A2)))” ============================================= excel从特殊字符串提取指定数据

在日常工作中,常常会遇到以下的参数: 如何把直径单独提取出来,以便进行直径比较或按直径汇总。 步骤/方法 选定直径的提取单元格,输入如图所示的公式,回车即可。 下拉表格,将公式复制至其他表格,这样就完美的提取出规格数据中的直径数值,之后就可以进行数据分类和汇总了。

/*输入一个字符串,内有数字和非数字字符,如a123x456_17960? 302tab5876,将其中连续的数字作为一个整数,请统计出一共有多少个整数,输出这些整数,并求出最长的整数的位数。*/ 说明:i,j,k用来遍历,flag作为是否是数字的标志,max表示最长的连续数字串,str[100]用来存放输入的字符串,a[10][10]用来存放数字串,最多可存放10组连续的数字,,,, #include #include main() {int i,j=0,k,flag=0,max=0; char str[100],a[10][10]; printf("请输入一串字符(包括数字)\n"); gets(str); for(i=0;str[i]!='\0';i++) if(48<=str[i]&&str[i]<=57) {if(flag==0) {j++; k=0; a[j][k]=str[i]; k++; flag=1;} else if(str[i+1]=='\0') { a[j][k]=str[i]; a[j][k+1]='\0'; } else { a[j][k]=str[i]; k++; } } else if(flag==1) { if(k>max) max=k; a[j][k]='\0'; flag=0; } printf("输入的字符串中,最长的数字串有%d位数字。数字串一共有%d个,分别是:\n",max,j); for(i=1;i<=j;i++) printf("%s\n",a[i]); }

程序大致流程图如下(“<=”是赋值):

go --创建函数(得到字符串中的汉字) create function [dbo].[m_getchinese] ( @chinese nvarchar(max) ) returns varchar(100) as begin while patindex('%[^吖-咗]%',@chinese)> 0 begin set @chinese =stuff(@chinese,patindex('%[^吖- 咗]%',@chinese),1,N''); end return @chinese end go --创建函数(得到字符串中的字母) create function [dbo].[m_getstr](@maco varchar(100)) returns varchar(max) as begin while patindex('%[^a-z]%',@maco)> 0 begin set @maco=stuff(@maco,patindex('%[^a-z]%',@maco),1,'') end return @maco end go --创建函数(得到字符串中的数字) create function [dbo].[m_getnumber] ( @mysql_one nvarchar(200) ) returns varchar(200) begin declare @mysql_two varchar(200) select @mysql_two=

substring(@mysql_one,patindex('%[0-9.]%',@mysql_one),patindex('%[ ^0-9.]%',substring(@mysql_one,patindex('%[0-9.]%',@mysql_one), len(@mysql_one)-patindex('%[0-9.]%',@mysql_one)+1))-1) return @mysql_two; end --测试 select dbo.[m_getchinese]('China2009中国HRB4-1v') select dbo.[m_getstr]('China2009中国HRB4-1v') select dbo.[m_getnumber]('China2009中国HRB4-1v') --运行结果 /* ----------- 中国 ----------- ChinaHRBv ----------- 2009 */ --说明一下 --上面这个取数字是可以取浮点型的 select dbo.[m_getnumber] ('字段.456A(AA)A')--正常 select dbo.[m_getnumber] ('CHinese2.1day')--正常 select dbo.[m_getnumber] ('Name5.01From')--正常 select dbo.[m_getnumber] ('9898Address')--正常 select dbo.[m_getnumber] ('aaaaaForm2.3333')--错误 --修正函数 go /* 取出字符串中间的数字(第二版)*/ create function [dbo].[m_getnumberV2.0] ( @mysql_one nvarchar(200) ) returns varchar(200) begin declare @mysql_two varchar(200)

用函数在Excel中从文本字符串提取数字 Excel输入数据过程中,经常出现在单元格中输入这样的字符串:GH0012JI、ACVB908、华升12-58JK、五香12.56元、0001#、010258等。在进行数据处理时,又需要把其中的数字0012、908、12-58、12.56、0001提取出来。 如何通过使用Excel的工作表函数,提取出字符串中的数字? 一、问题分析 对于已经输入单元格中的字符串,每一个字符在字符串中都有自己固定的位置,这个固定位置都可以用序列数(1、2、3、……)来表示,用这些序列数可以构成一个可用的常数数组。 以字符串“五香12.56元”为例:序列数1、2、3、4、5、6、7、8分别对应着字符串“五香12.56元”中字符“五”、“香”、“1”、“2”、“.”、“5”、“6”、“元”。由序列数组成一个保存在内存中的新数组{1;2;3;4;5;6;7;8}(用列的形式保存),对应字符串中的字符构成的数组{“五”;“香”;“1”;“2”;“.”;“5”;“6”;“元”}。因此解决问题可以从数组着手思考。 二、思路框架 问题的关键是,如何用序列数重点描述出字符串中的数字部分的起始位置和终止位置,从而用MID函数从指定位置开始提取出指定个数的字符(数字)。 不难看出,两个保存在内存中的新数组: {“五”;“香”;“ 1”;“2”;“.”;“5”;“6”;“元”} {1;2;3;4;5;6;7;8} 数组具有相同大小的数据范围,而后一个数组中的每一个数值可以准确地描述出字符串中字符位置。 字符与序列数的对应关系如下表所示: 字符字符位置

五—— 1 香—— 2 1 —— 3 2 —— 4 . —— 5 5 —— 6 6 —— 7 元—— 8 所以解决问题的基本框架是: 用MID函数从字符串的第一个数字位置起提取到最后一个数字止的字符个数。即{=MID(字符串,第一个数字位置,最后一个字符位置-第一个字符位置+1}。其中“+1”是补上最后一个数字位置减去第一个数字位置而减少的一个数字位。 三、解决方案及步骤 假定字符串输入在A2单元格。 ⑴确定A2中字符串的长度。 即用LEN函数计算出A2中字符串中字符的个数,这个字符个数值就是字符串中最后一个字符在字符串中的位置:=LEN(A2)。 ⑵确认字符串中的每一个字符位置序列数组成的新数组。 用INDIRECT函数返回一个由文本字符串指定的引用:

第一种方法,使用正则表达式: function findNum($str=''){ $str=trim($str); if(empty($str)){return '';} $reg='/(\d{3}(\.\d+)?)/is';//匹配数字的正则表达式 preg_match_all($reg,$str,$result); if(is_array($result)&&!empty($result)&&!empty($result[1])&&!empty($result[1][0])){ return $result[1][0]; } return ''; } 第二种方法,使用in_array方法: function findNum($str=''){ $str=trim($str); if(empty($str)){return '';} $temp=array('1','2','3','4','5','6','7','8','9','0'); $result=''; for($i=0;$i

e x c e l中一个单元格中有文字字母字符和数字如何能把数字单独提取出来提取数字 公司内部编号:(GOOD-TMMT-MMUT-UUPTY-UUYY-DTTI-

excel中一个单元格中有文字字母字符和数字如何能把数字单独提取出来?2011-04-13 11:25匿名?|?分类:?|?浏览1375次 如A1中 A本月电费收入(美兰供电所)(对帐标志: 想在B中表示为 最好能教一个方法十分感谢 我有更好的答案 按默认排序| 2条回答 |2011-04-13 11:32|十五级 在EXECL理,按ALT+F11,插入-模块,复制下列语句 Function SplitNumEng(str As String, sty As Byte) Dim StrA As String Dim StrB As String Dim StrC As String Dim i As Integer Dim SigS As String For i = 1 To Len(str) SigS = Mid(str, i, 1)

If SigS Like "[a-zA-Z]" Then StrA = StrA & SigS ElseIf SigS Like "#" Then StrB = StrB & SigS Else StrC = StrC & SigS End If Next i Select Case sty Case 1 SplitNumEng = StrA Case 2 SplitNumEng = StrB Case Else SplitNumEng = StrC End Select End Function 比如你的数据在A1

中英文及数字字符的提取技巧 从混排文字中提取连续数字 如图1-1所示,A列中有一些产品规格型号,其中包含了连续数字,且数字均位于字符串的末尾,数字之后没有其他字符跟随。要从这样的文本字符串中提取连续数字,可在B2单元格中输入以下公式并向下填充: =-LOOKUP(9.9E+307,--RIGHT(A2,ROW($1:$99))) 图1-1 提取连续数字 公式解析: 公式通过依次提取字符串右侧的连续1~n个字符,形成一个数组,然后通过LOOKUP函数可以查找其中最大的数值的功能,找出其中包含连续数字最多的那个数。9.9E+307是科学计数法的表示方式,表示9.9乘以10的307次方,这是Excel里面超级大的一个数,以这个数作为LOOKUP函数的查询对象,只要数组中的数值小于它就能被查询得到。 事实上,这个公式还有不少局限性,例如一些数学符号会对结果产生影响,超过15位有效数字的连续数字也会不能被正确提取等等。 假设目标字符串的数字位于字符串中部,前后都有非数字字符与其相连,如图1-2中A列的型号所示。对于这种情况,在原公式基础上进行一些修改: =LOOKUP(9.9E+307,--MID(A2,MIN(FIND({0;1;2;3;4;5;6;7;8;9},A2&1234567890)), ROW($1:$99)))

图1-2 数字位于字符串中部 这个公式通过FIND函数来定位首个数字出现的位置,然后通过MID函数来依次取出连续的1~n个字符。再参照前面公式的思路得到最后结果。 从混排文字中提取连续字母 如图1-3表格所示,A列中有一些车牌编号,其中包含了连续英文字母,且字母均位于字符串的中部。不考虑字母后跟随数字的特殊性,要从这样的文本字符串中提取连续字母,可在B2单元格中输入以下数组公式并向下填充: {=MID(A2,MATCH("z",TEXT(CODE(MID(UPPER(A2),ROW($1:$99),1))-64,"[>26];;z") ,0),COUNT(N(INDIRECT(MID(A2,ROW($1:$99),1)&"1"))))} 图1-3 提取连续英文字母 公式解析: 此公式主体结构是通过MID函数取出字符串中的连续字符,其中包含了两种鉴别英文字母的方法。 CODE(MID(UPPER(A2),ROW($1:$99),1))可以返回字符串中每个字符的ASCII代码,其中在65~90之间的就是英文大写字母的ASCII码。 INDIRECT(MID(A2,ROW($1:$99),1)&"1")部分则是利用了字母+数字的形式在Excel中是

/* *从字符串中提取连续的字符数字转换为整数 */ #include #include"string.h" void main() { char c[100]; bool find=false; int sum[30],num[50],i=0,l,s=0,N=1,g=0; printf("请输入一含有数字的字符串:\n"); gets(c); l=strlen(c); while(true)//判断字符串中是否有字符数字,有则执行下一步,没有则重新输入 { while(l) { if(c[l]>='0'&&c[l]<='9')//判断是否含有数字字符 { find=true; break; } l--; } if(find) break;//有数字则退出循环 else printf("没有数字!!! 请重新输入:\n"); gets(c);//没有则重新出入 l=strlen(c); } l=strlen(c); printf("字符串长度为:%d\n",l); for(i=0;i='0')&&(c[i]<='9')) { sum[s++]=c[i]-48;//单个字符数字转换为数字 N*=10; if(c[i+1]<='0'||c[i+1]>='9'||c[i+1]=='\0')//判断下一个字符是否为字符数字,不是则执行下一步,即是否是一个连续的数 { num[g]=0;

N/=10; for(int j=0;j

EXCEL中从一个字符串里提取连续数字引发的思考(一) 从一个字符串中提取连续数字的函数 =LOOKUP(9E+307,--MID(A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},A1&"0123456789")),RO W(INDIRECT("$1:$"&LEN(A1))))) 引发的思考(一) 假设A1=“总人口7895432个”,A列的内容都是这种形式的,你的任务就是把其中的数字单独提取出来放到B列。以B1单元格为例: 此函数的思路就是先在A1中找到第一个数字的位置,依次1位、2位……的提取出来,很显然最后一个数字就是需要的结果。函数框架就是find找数字出现的位置,通过min过滤出第一个位置,mid从此位置开始提取,提取的位数由row升序排列,然后转换成数字,最后用lookup找出其中最大的数。 首先用FIND({0,1,2,3,4,5,6,7,8,9},A1&"0123456789")找出A1中数字所在的位置,因为{0,1,2,3,4,5,6,7,8,9}是一个数组,则返回值也是一个数组,按F9试算就一目了然;不过,B1单元格里只会出现第一个数字”0”的位置。要避免出现#value错误,那么A1必须要串联一串数字,A1&"0123456789"就是这个原因。 有些屌丝为了显示高深莫测,把数组{0,1,2,3,4,5,6,7,8,9}写成数组ROW($1:$10)-1来显摆;把A1&"0123456789"写成A1&5^19来浪费计算资源!就为了表示他知道 5^19=19073486328125,包含了0到9的所有数字!

min(find)的结果才是需要的,在find的结果中找出最小的数字,也就是A1中数字最高位”7”所在的位置4。至此,mid函数的第一个参数单元格A1,第二个参数4都有了,第三个参数就要用row函数来决定了。 ROW(INDIRECT("$1:$"&LEN(A1)))={1;2;3;4;5;6;7;8;9;10;11}。有些屌丝爱写成row ($1:$1024)浪费计算资源,就为了表示他知道excel限制单元格内最多可以输入1024个字符! 关于row函数为什么要这样写,而不直接写成ROW($1:$LEN(A1))请听下回分解。 因为row返回的是一个数组,那么mid也跟着返回一个数组{"7";"78";"789";"7895";"78954";"789543";"7895432";"7895432个";"7895432个";"7895432个";"7895432个"},现在还是字符状态,用两个减号“--”跟在mid前面,负负得正转换成数字,则数字都提取完之后再提取的带字符“个”的就会提示#VALUE!错误,结果就是{"7";"78";"789";"7895";"78954";"789543";"7895432";#VALUE!;#VALUE!; #VALUE!; #VALUE!},为后面的lookup作铺垫。 最后使用lookup在mid返回的数组中找"最大的数",为啥这个"最大的数"要加引号呢?因为找到的并不一定就是数组中最大的数。此函数比较笨,首先,并不是精确查找,在数组中刚好有等于查找值的情况下返回的是正确的逻辑结果;在找不到查找值的情况下,则是取数组中的最后一个小于查找值、并且最接近于它的数!要想找到mid返回的数组中的最大值,

如何提取e x c e l中的一段数字文字符 标准化管理处编码[BBX968T-XBB8968-NNJ668-MM9N]

一、单元格A1中有如下内容:要提取出数字 提取Excel单元格中连续的数字的函数公式是: =LOOKUP(9E+307,--MID(A1,MIN(FIND({1,2,3,4,5,6,7,8,9,0},A1&90)),ROW($1:$8))) 或者 =LOOKUP(9E+307,--MID(H2,MIN(FIND({0;1;2;3;4;5;6;7;8;9},H2&90)),ROW(INDIRECT(" 1:"&LEN(H2))))) 解释一下这个公式 FIND函数——查询文本所在位置 FIND(find_text,within_text,[start_num]) FIND(需查找的文本,包含查找文本的单元格,开始查找单元格的字符位置(可选)) 此处FIND函数是搜索{1,2,3,4,5,6,7,8,9,0}数字在“A1&90”中所在的位置; A1&90的目的是在用FIND函数查询时,不出现错误值,使之后的MIN函数可以正常运行。 即FIND({1,2,3,4,5,6,7,8,9,0},“小王联系电话负责财务90”) 选取划黑后按F9,得出的位置为:{19,20,21,22,7,9,10,8,13,11} MIN函数——返回列表中的最小值 MIN(number1,number2,……) MIN(数字1,数字2,……) 将FIND所得结果{19,20,21,22,7,9,10,8,13,11}带入MIN函数,最小值所得为7,正是第一个数值出现的位置; 也正是之前FIND函数中使用A1&90的原因。

?当字母字符和数字字符连在一起时,如abc123或678sfr。 ?当字母字符和数字字符没有连在一起时,如 问题 如何提取字母数字字符串的数字部分。例如:如果单元格A1 包含的是字符串“abc123”,则将值123 返 回单元格B1 中。 解决方案 此解决方案的基本原理是搜索并返回字母数字字符串中的第一个数字,然后只返回其后的数字。 算法 ; 此解决方案包括创建公式以完成下列任务: 1. 将字母数字字符串分解为单独的字符。 2. 确定分解后的字符串中是否有数字。 3. 确定数字在字母数字字符串中的位置。 4. 计算字母数字字符串中数字的数量。 我们将分别考虑这些任务,然后将各公式整合在一起以得到最终结果。

将字母数字字符串分解为单独的字符 请在此使用MID 函数。MID 可以根据所指定的字符的数量,从所指定的位置开始,从文本字符串中返回特定数量的字符。此函数的语法是: MID(text,start_num,num_chars) ?Text文本字符串包含的是要提取的字符。 ?Start_num要从文本中提取的第一个字符串的位置。文本 中第一个字符占据start_num 1,以此类推。 ?Num_chars指定要MID 从文本中返回的字符数量。 对于我们的示例,公式为: =MID(A1,ROW($1:$9),1) 此公式可以分解字母数字字符串,并且实际上会将字符置于工作表的不同行内。例如,对于字母数字字符串abc123,其所有 6 个字符都将被分开。 注释可将数值9 适当增大为任何更大的数值,以适应更长的字符串。在此示例中,最大字符串长度为9。值得一提的是,字符串分解之后,“1”、“2”和“3”将被看作文本而不是数字。要将存储为文本的数字转换成数字,请用 1 乘以此公式,例如: =1*MID(A1,ROW($1:$9),1) 确定分解后的字符串中是否有数字 在此我们将使用ISNUMBER 函数,此函数可以确定字母数字字符串中是否有数字。公式现在变成了:=ISNUMBER(1*MID(A1,ROW($1:$9),1)) 如果字符串中有数字,则结果将为TRUE,否则结果将为FALSE。 确定数字在字母数字字符串中的位置 现在我们将通过在上一段中提到的分解后的字符串的结果中查找TRUE 值来确定数字的位置。在此我们将使用MATCH 函数。经过修改的公式现在变为:

C语言中把数字转换为字符串 在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望。由于sprintf 跟printf在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。这也导致sprintf 比printf有用得多。 sprintf 是个变参函数,定义如下: int sprintf( char *buffer, const char *format [, argument] ... ); 除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数:格式化字符串上。 printf 和sprintf 都使用格式化字符串来指定串的格式,在格式串内部使用一些以“%”开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要的字符串。 格式化数字字符串 sprintf 最常见的应用之一莫过于把整数打印到字符串中,所以,spritnf 在大多数场合可以替代 itoa。 如: //把整数123 打印成一个字符串保存在s 中。 sprintf(s, "%d", 123); //产生"123" 可以指定宽度,不足的左边补空格: sprintf(s, "%8d%8d", 123, 4567); //产生:" 123 4567" 当然也可以左对齐: sprintf(s, "%-8d%8d", 123, 4567); //产生:"123 4567" 也可以按照16 进制打印: sprintf(s, "%8x", 4567); //小写16 进制,宽度占8 个位置,右对齐 sprintf(s, "%-8X", 4568); //大写16 进制,宽度占8 个位置,左对齐 这样,一个整数的16 进制字符串就很容易得到,但我们在打印16 进制内容时,通常想要一种左边补0的等宽格式,那该怎么做呢?很简单,在表示宽度的数字前面加个0 就可以了。 sprintf(s, "%08X", 4567); //产生:"000011D7" 上面以”%d”进行的10 进制打印同样也可以使用这种左边补0 的方式。 这里要注意一个符号扩展的问题:比如,假如我们想打印短整数(short)-1 的内存16 进制表示形式,在Win32平台上,一个short 型占2 个字节,所以我们自然希望用4 个16 进制数字来打印它: short si = -1;

相关主题