분석 과학적인 표 현명하게?
-
10-07-2019 - |
문제
할 수 있는 함수를 작성하는 숫자 표기법으로 문자열을 나누는 그것의 계수와 지수 별도의 항목으로.수 정규 표현식을 사용하여,그러나 들어오는 번호되지 않을 수 있습 찾기 부분을 찾을 수 없습니다 그리고 나는 것을 선호 할 수 있 프로그램에서는 그 후 부속니다.
동료가 부분의 방법으로는 솔루션을 사용하여 VB6 하지만 그것은 아직 거기로서,성적증명서 아래에 보여줍니다.
cliVe> a = 1e6
cliVe> ? "coeff: " & o.spt(a) & " exponent: " & o.ept(a)
coeff: 10 exponent: 5
되어 있어야 1 6
cliVe> a = 1.1e6
cliVe> ? "coeff: " & o.spt(a) & " exponent: " & o.ept(a)
coeff: 1.1 exponent: 6
정
cliVe> a = 123345.6e-7
cliVe> ? "coeff: " & o.spt(a) & " exponent: " & o.ept(a)
coeff: 1.233456 exponent: -2
정
cliVe> a = -123345.6e-7
cliVe> ? "coeff: " & o.spt(a) & " exponent: " & o.ept(a)
coeff: 1.233456 exponent: -2
해야 -1.233456 및 -2
cliVe> a = -123345.6e+7
cliVe> ? "coeff: " & o.spt(a) & " exponent: " & o.ept(a)
coeff: 1.233456 exponent: 12
정
어떤 아이디어가?방법으로,이는 CLI 기반으로 VBScript 및에서 찾을 수 있습니다 나 weblog.
해결책
구글에 "과학적인 표기 regexp" 여 일치하는 번호를 포함하여, 이 (그것을 사용하지 않!!!! 도)어떤 사용
*** warning: questionable ***
/[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?/
을 포함하는 경우-.5e7 와+00000e33(둘 다 원하지 않을 수도 있습을 허용하).
대신,나 고도 추천을 사용하는 구문에 더그 Crockford 의 JSON 웹사이트 는 문서를 명시적으로 무엇을 구성하는 숫자에 JSON.여기에 해당하는 구문에 다이어그램에서 촬영하는 페이지:
(출처: json.org)
을 살펴보면 선 456 그 json2.js 스크립트(안전 변환기/JSON 에서 javascript),당신은 이 부분의 regexp:
/-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/
는 아이러니하게도,일치하지 않을 그의 구문에 다이어그램....(처럼 나는 버그를)믿 regexp 는가를 구현하는 구문에 다이어그램 이 하나:
/-?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?/
고할 수 있도록 허용하려면 초기+뿐만 아니라,당신이 얻을:
/[+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?/
추가 괄호 캡처를 좋아합니다.
또한 것을 살리의 테스트 사례를 보장하기 위해,당신은 그들을 포함 가능성을 포함 할(또는 아 포함)와 같은:
allowed:
+3
3.2e23
-4.70e+9
-.2E-4
-7.6603
not allowed:
+0003 (leading zeros)
37.e88 (dot before the e)
행운을 빕니다!
다른 팁
건물의 가장 가격 대답은,나는 수정된 정규 표현식이 약간 수 /^[+\-]?(?=.)(?:0|[1-9]\d*)?(?:\.\d*)?(?:\d[eE][+\-]?\d+)?$/
.
는 혜택이 제공합니다:
- 할 수 있습 같은 일치하는 번호
.9
(나(?:0|[1-9]\d*)
선택?
) - 을 방지 일치하는 그냥 운전자에서 시작하고 막는 일치하는 제 길이 문자열은(사용 예측,
(?=.)
) - 을 방지 일치하는
e9
기 때문에 그것이 필요합\d
전에는 과학적인 표기
나의 목표에 이은 그것을 사용하는을 위한 캡처 상당한 수치와 하는 중요한 수학이다.그래서 나는 또한 슬라이스와 함께 그것을 캡처하는 그룹이다. /^[+\-]?(?=.)(0|[1-9]\d*)?(\.\d*)?(?:(\d)[eE][+\-]?\d+)?$/
.
에 대한 설명을 얻는 방법 중요한 인물에서 이:
- 전체 캡처할 수 있는 수는 손해
parseFloat()
- 경기 1-3 표시됩니다으로 정의되지 않았거나 문자열을,그래서 그들을 결합(대체
undefined
's''
)를 제공해야는 원래의 수에서 상당한 수치를 추출할 수 있습니다.
이 regex 도 일치하는 왼쪽 패딩 제로,어떤 자바스크립트로지 하지만 나는 본적인 문제는 아무것도 추가하여 중요한 수치다,그래서 나는 방지를 참조하십시오 왼쪽 패딩 으로 혜택(특히 양식에서).그러나 나는 regex 수정할 수 있습을 중얼 왼쪽 패딩합니다.
또 다른 문제가 나는 이 regex 그것은 일치하지 않습니다 90.e9
또는 다른 숫자입니다.그러나 내가 이것을 발견 또는 이와 유사한과 일치하지 않으로 컨벤션에서 과학적인 표기를 방지하는 숫자입니다.하지만 입력할 수 있는 자바 스크립트에서,당신은 쉽게 입력 9.0e10
와 달 같은 중요한 수치입니다.
업데이트
내 테스트에서,내가 또는 오류 수 있는 경기 '.'
.그래서 보면 미로 수정해야 (?=\.\d|\d)
에 이르는 최종 regex:
/^[+\-]?(?=\.\d|\d)(?:0|[1-9]\d*)?(?:\.\d*)?(?:\d[eE][+\-]?\d+)?$/
여기에 몇 가지 펄 코드가 해킹을 함께 빠르게.
my($sign,$coeffl,$coeffr,$exp) = $str =~ /^\s*([-+])?(\d+)(\.\d*)?e([-+]?\d+)\s*$/;
my $shift = length $coeffl;
$shift = 0 if $shift == 1;
my $coeff =
substr( $coeffl, 0, 1 );
if( $shift || $coeffr ){
$coeff .=
'.'.
substr( $coeffl, 1 );
}
$coeff .= substr( $coeffr, 1 ) if $coeffr;
$coeff = $sign . $coeff if $sign;
$exp += $shift;
say "coeff: $coeff exponent: $exp";