문을수 함수가 실수 형식을 지원하지 못하고, 또 너무 긴 수는 제대로 변환하지 못하는 안타까운(?) 버그때문에 문을실수 함수를 새로 만들게 되었습니다.
바로 아래 글에서 클립하신 분들인 이 것으로 바꿔주시길 ^^; 아래에 나온 방법을 포기하고 완전히 새로운 방법으로 새로 만들었습니다. 그래서, 소수점은 물론 음수와 지수 표기법까지 완벽하게 지원합니다. 물론, 처리가 추가된 만큼 조금 느려졌기 때문에, 이전 방법은 남겨두겠습니다. 필요한 용도에 따라서, 적당한 것을 골라서 사용하시면 될 것 같네요.
아래는 소스입니다. 사용 하실때는 첨부파일로 올린 사용자 함수 파일을 이용해주세요! 주석이 있기 때문에, 제대로 동작하지 않는 버그가 있습니다. 그리고, 창조는 주석이 있으면 좀 느려지기 때문에, 지우고 사용하시는게 여러모로 좋습니다 ^^ 어쨌든, 원리(?)는 밝히기 위해 주석까지 있는 버전을 여기에 적습니다.
이 소스는 이런 것을 지원합니다.
문을실수("1234") ==> 1234 문을실수("3.14159") ==> 3.14159 문을실수("-2.7182818") ==> -2.7182818 문을실수("7.389e+2") ==>738.9 문을실수("-1771.4E-3") ==> -1.7714
// ******************************************************** 실수함수:문을실수(문자:문); // ******************************************************** 실수:문길이,ㅋ; // ㅋ는 카운터 변수, 변수 이름에 오해 없기를 *-_-* 실수:총합,지수; 실수:문자코드,숫자; 문자:ㄱㅈ; // 한 "글자" 진리:음수다,소수네; // 이 놈이 음수인지?, 그리고 소수점 이하 숫자인지?
// 일단 전체 문자의 길이를 구해두고
문길이 := 문자길이(문);
// 카운터 초기화
ㅋ := 1; // 문자 함수들은 1부터 시작하니까
// 1. 음수인지 검사합니다. 앞에 - 가 붙었나? // 문자복사(문,1,1) = "-" 와 같음 음수다 := (문자비교(문자복사(문,1,1),"-") = 0);
만일(음수다) { // 음수면 카운터를 2부터 시작하도록 // - 기호는 빼고 읽어야 하니까 ㅋ := 2; }
// 이제, 한 글자 한 글자 읽어오는 겁니다. 총합 := 0; 지수 := -1; // 소수점 첫째 자리부터 시작 되풀이(ㅋ <= 문길이) { ㄱㅈ := 문자복사(문,ㅋ,1); // 문자코드로 일단 바꿔서 처리합니다. // ***여기서 필요한 문자코드들*** // 0~9 [48-57] // . [46] // e, E [101, 69] // +, - [43, 45] 문자코드 := 문수(ㄱㅈ);
// 숫자에 대한 처리... 만일((문자코드 >= 48) 그리고 (문자코드 <= 57)) { 숫자 := 문자코드-48; 만일(소수네) { // 소수일 때는 그냥 더하기만 하는데 // 이 때 10의 지수 제곱을 곱해서~ 더해주면 된다. // 역시 왜 그런지는 직접 컴퓨터가 되어서!!! 총합 := 총합 + 숫자*제곱(10,지수); 지수 := 지수 - 1; // 이렇게 하면 너무 작은 숫자는 알아서 잘리게 됨. ~_~ } 아니면 { // 10 곱하고, 더한다. 왜 그런지는, 한번 컴퓨터가 되어서 직접 해보세요! 총합 := 총합*10+ 숫자; } } 아니면 만일(문자코드 = 46) { // 소수점에 대한 처리! // 소수점이 나오면 플래그 하나면 켜면 됩니다. 소수네 := 참; } 아니면 만일((문자코드 = 101) 또는 (문자코드 = 69)) { // 지수에 대한 처리! // 1.0E+0 같이, E 부분 이하는 지수 부분이다. // 대소문자 구분을 위해 두 가지 모두 검사... // E 뒷부분 글자를 모두 읽어서 그냥 지수화 해서 곱하면 땡 // 지수는 별로 길지도 않을테니까 여기서는 간단하게...! 숫자 := 문을수(문자복사(문,ㅋ+1,(문길이-ㅋ)),0);
총합 := 총합 * 제곱(10,숫자); // 이제 더 이상 처리할 필요도 없다 그쳐; }
ㅋ := ㅋ + 1; }
// 결과만 반환하면 끝! // 이 때 음수 처리를 잊지 말아야 만일(음수다) { 결과 := -총합; } 아니면 { 결과 := 총합; }
|