화폐 / 통화에 대한 HTML5 입력


80

양식에서 금전적 가치를 받아들이 기 위해 무엇을 사용해야할지 알 수없는 것 같습니다.

나는 시도했다 ...

<input type="number" min="0" max="10000" step="1" name="Broker_Fees" id="broker_fees" required="required">

그러나 그것은 펜스 항목을 허용하지 않습니다.

증분 버튼 컨트롤이 파운드 단위로 올라 가기를 원하지만 여전히 펜스에 들어갈 수있는 기능을 원합니다.

한 번에 1p 씩 이동하는 증분 버튼을 누가 사용하고 싶습니까?

잘못된 컨트롤을 사용하고 있는데 돈 / 통화 컨트롤을 찾을 수 없습니까?

누군가 HTML5를 사용하여 금전적 가치 (쉼표, 소수 자릿수 및 통화 기호 포함)를 허용하는 가장 좋은 방법을 조언 해 주시겠습니까?

감사합니다, 1DMF


step소수점 이하 자릿수로 속성 을 지정해야합니다 . 참조 : HTML (5)에 부동 입력 유형이 있습니까?
feeela 2014-06-11

1
질문을 다시 읽고 내가 이미이 작업을 수행했으며 원하지 않는 결과를 생성한다는 것을 이해했는지 확인하십시오. 이러한 상황에서 어떻게 이것이 다른 스레드의 중복 일 수 있습니까?
1DMF 2014-06-11

글쎄, 당신은 "금전적 가치를 받아들이는 가장 좋은 방법"을 요구하고 있습니다. 입력을받는 것은 대체 입력 방법을 제공하는 것과 다릅니다. 숫자 입력을 사용하여 사용자는 주어진 속성과 일치하는 유효한 숫자를 직접 삽입 할 수 있습니다. 당신은 여전히 ... 파운드, 그 증분을 추가 버튼을 추가 할 수 있습니다
feeela

불행히도 HTML5로는 이것을 제어 할 수 없습니다. 그러나 이것은 당신에게 흥미로울
alexander farkas 2014-06-11

감사합니다 farkas,하지만 작동하게 할 수없는 것 같고, 스핀 버튼은 아무것도하지 않으며 입력도 입력 할 수 없습니다. FF에서 작동하는 것 같다하지만 IE
1DMF

답변:


68

숫자 입력을 위해 분수 / 중앙 / 소수 활성화

HTML5 숫자 입력에 분수 (센트)를 허용하려면 "step"속성을 "any"로 지정해야합니다.

<input type="number" min="1" step="any" />

이것은 특히 십진수 / 분수 통화가 입력에 입력 될 때 Chrome에서 오류를 표시하지 않도록합니다. Mozilla, IE 등은 지정하는 것을 잊어도 오류가 발생하지 않습니다 step="any". W3C 사양에 따르면 십진수를 허용하려면 step = "any"가 실제로 필요합니다. 따라서 반드시 사용해야합니다. https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/number#step

위 / 아래 버튼이 특정 단위를 수행하도록하려면 ".01"과 같은 숫자 단계를 지정해야합니다.

또한 숫자 입력이 현재 상당히 광범위하게 지원됩니다 (사용자의 90 % 이상).


화폐 / 통화에 대해 어떤 입력 옵션이 있습니까?

그 이후로 질문의 제목이 바뀌었고 약간 다른 의미를 갖습니다. 돈 / 소수를 받아들이 기 위해 숫자 또는 텍스트 입력을 모두 사용할 수 있습니다.

통화 / 돈에 대한 입력 필드의 경우 입력 유형의 숫자를 사용하고 위에 설명 된대로 적절한 속성을 지정하는 것이 좋습니다. 2020 년 현재, 실제 입력 유형의 통화 또는 화폐에 대한 W3C 사양이 없습니다.

주된 이유는 사용자가 유효한 표준 통화 형식을 입력하도록 자동으로 강요하고 영숫자 텍스트를 허용하지 않기 때문입니다. 즉, 일반 텍스트 입력을 사용하고 숫자 / 십진수 값만 가져 오기 위해 일부 사후 처리를 수행 할 수 있습니다 (언젠가는 서버 측 유효성 검사도 있어야 함).

OP는 통화 기호와 쉼표의 요구 사항을 자세히 설명했습니다. 더 멋진 로직 / 포맷을 원한다면 (2020 년 현재) 텍스트 입력을위한 커스텀 JS 로직을 생성하거나 플러그인을 찾아야합니다.


55

를 사용해보십시오 step="0.01". 그러면 매번 1 페니 씩 밟아갑니다.

예 :

<input type="number" min="0.00" max="10000.00" step="0.01" />


4
이것은 잘 작동합니다. 그러나 "1.28 ... 1.29 ... 1.3 ... 1.31 ..." 과 같은 숫자를 순환한다는 점에 주목할 가치가 있습니다 . 즉 후행 0은 없습니다 (통화가 아닌 숫자이기 때문에). 관련 : HTML5 숫자 필드에 후행 0을 표시하려면 어떻게해야합니까?
Duncan Jones

모든 언어가 통화 체계에 십진수를 사용하는 것은 아닙니다.
Amirreza

30

자바 스크립트의 Number.prototype.toLocaleString 사용 :

var currencyInput = document.querySelector('input[type="currency"]')
var currency = 'GBP' // https://www.currency-iso.org/dam/downloads/lists/list_one.xml

 // format inital value
onBlur({target:currencyInput})

// bind event listeners
currencyInput.addEventListener('focus', onFocus)
currencyInput.addEventListener('blur', onBlur)


function localStringToNumber( s ){
  return Number(String(s).replace(/[^0-9.-]+/g,""))
}

function onFocus(e){
  var value = e.target.value;
  e.target.value = value ? localStringToNumber(value) : ''
}

function onBlur(e){
  var value = e.target.value

  var options = {
      maximumFractionDigits : 2,
      currency              : currency,
      style                 : "currency",
      currencyDisplay       : "symbol"
  }
  
  e.target.value = (value || value === 0) 
    ? localStringToNumber(value).toLocaleString(undefined, options)
    : ''
}
input{
  padding: 10px;
  font: 20px Arial;
  width: 70%;
}
<input type='currency' value="123" placeholder='Type a number & click outside' />


이것은 깔끔한 솔루션이지만 일부 국가의 사용자에게는 localStringToNumber 변환이 실패합니다. 예를 들어 프랑스는 소수점으로 쉼표를 사용합니다. 이 경우 시작 값 123은 123,00 (올바르게)으로 변환되지만 초점이 맞으면 12300으로, 흐림이 생기면 12300,00으로 변경됩니다. 본질적으로 모든 초점과 흐림은 실수로 값에 100을 곱합니다!
peteredhead

@peteredhead-재현하는 방법? currency변수를 다른 것으로 변경 했습니까 ?
vsync

toLocaleString의 첫 번째 인수는 형식화에 사용할 로케일입니다. 코드에서 정의되지 않음으로 설정되어 있으므로 브라우저 / 시스템 설정을 사용합니다. 다른 국가의 사용자에게 어떻게 작동하는지 테스트하려면 "fr-FR"로 설정할 수 있습니다 (예
peteredhead

매우 흥미로운. 여기의 국가 목록 사용 쉼표소수점
VSYNC

숫자 ( Strings 로 표현되는 다른 로케일에서 )를 다시 숫자로 변환 하는 것은 매우 어렵다는 것을 알았습니다 . 다양한 숫자 체계가 있습니다. 올바른 로케일을 감지하고 그에 따라 변환 기능을 적용해야합니다. 코드베이스를 부 풀릴 많은 변환 함수가 미리 준비되어야합니다. 너무 슬퍼.
VSYNC

2

결국 나는 HTML5 / CSS 솔루션을 구현하고 IE에서 증가 버튼을 사용하지 않고 타협해야했지만 (어쨌든 FF에서는 조금 고장났습니다!), JQuery 스피너가 제공하지 않는 숫자 유효성 검사를 얻었습니다. 나는 정수 단계로 가야했지만.

span.gbp {
    float: left;
    text-align: left;
}

span.gbp::before {
    float: left;
    content: "\00a3"; /* £ */
    padding: 3px 4px 3px 3px;
}

span.gbp input {
     width: 280px !important;
}
<label for="broker_fees">Broker Fees</label>
<span class="gbp">
    <input type="number" placeholder="Enter whole GBP (&pound;) or zero for none" min="0" max="10000" step="1" value="" name="Broker_Fees" id="broker_fees" required="required" />
</span>

유효성 검사는 IE / FF에서 쉼표와 소수점 이하 자릿수 (.00 인 경우)를 허용하는 브라우저에서 약간 불안정합니다.

JQuery 스피너가 숫자 유형 입력과 함께 작동하지 않는 것이 부끄러운 일이지만 문서는 명시 적으로 그렇게하지 않도록 명시하고 있습니다.


1
JSFiddle의 위 - jsfiddle.net/yz9w9g3r JSFiddle의 비틀기하지만 단계 모든 통화 문자의 더 나은 위치에 - jsfiddle.net/yz9w9g3r/1
scraymer

훌륭하지만 이것은 국제적인 해결책이 아니라는 점에 유의해야합니다. (그런 다음 브라우저는 <input type="number">아직 제대로 작동 하지 않는 i18n을 얻지 못했습니다. stackoverflow.com/questions/15303940/… )
Michael Scheper

0

<input type="number" />유로 십진수 및 쉼표 형식을 표시 할 수 없기 때문에 유로에 대한 화폐 가치를 수락하는 데 동일한 문제가있었습니다 .

우리는 <input type="number" />사용자 입력 에 사용할 솔루션을 찾았습니다 . 사용자가 값을 입력 한 후로 전환하여 형식을 지정하고 유로 형식으로 표시합니다 <input type="text" />. 하지만 이것은 자바 스크립트 솔루션입니다. "사용자가 입력 중입니다"와 "사용자에게 표시"모드를 결정하는 조건이 필요하기 때문입니다.

솔루션에 대한 Visuals 링크 : 입력 필드 유형 "통화"문제 해결

이것이 어떤 식 으로든 도움이되기를 바랍니다!


0

나는 비슷한 대답을 찾기 위해이 기사를 우연히 발견했습니다. @vsync 예제 Using javascript 's Number.prototype.toLocaleString :을 읽었으며 잘 작동하는 것 같습니다. 내가 가진 유일한 불만은 input type="currency"페이지에 하나 이상의 것이 있으면 첫 번째 인스턴스 만 수정한다는 것입니다.

그가 그의 코멘트에서 언급했듯이 그것은 단지 stackoverflow의 예로서 설계되었습니다.

그러나 예제는 저에게 잘 작동했으며 JS에 대한 경험이 거의 없지만 for 루프를 추가하는 대신 input type="currency"페이지 에서 여러 개로 작동하도록 수정하는 방법을 알아 냈습니다 .document.querySelectorAlldocument.querySelector

다른 사람에게 유용 할 수 있기를 바랍니다. (대량의 코드에 대한 크레딧은 @vsync입니다)

var currencyInput = document.querySelectorAll( 'input[type="currency"]' );

for ( var i = 0; i < currencyInput.length; i++ ) {

    var currency = 'GBP'
    onBlur( {
        target: currencyInput[ i ]
    } )

    currencyInput[ i ].addEventListener( 'focus', onFocus )
    currencyInput[ i ].addEventListener( 'blur', onBlur )

    function localStringToNumber( s ) {
        return Number( String( s ).replace( /[^0-9.-]+/g, "" ) )
    }

    function onFocus( e ) {
        var value = e.target.value;
        e.target.value = value ? localStringToNumber( value ) : ''
    }

    function onBlur( e ) {
        var value = e.target.value

        var options = {
            maximumFractionDigits: 2,
            currency: currency,
            style: "currency",
            currencyDisplay: "symbol"
        }

        e.target.value = ( value || value === 0 ) ?
            localStringToNumber( value ).toLocaleString( undefined, options ) :
            ''
    }
}

    var currencyInput = document.querySelectorAll( 'input[type="currency"]' );

    for ( var i = 0; i < currencyInput.length; i++ ) {

        var currency = 'GBP'
        onBlur( {
            target: currencyInput[ i ]
        } )

        currencyInput[ i ].addEventListener( 'focus', onFocus )
        currencyInput[ i ].addEventListener( 'blur', onBlur )

        function localStringToNumber( s ) {
            return Number( String( s ).replace( /[^0-9.-]+/g, "" ) )
        }

        function onFocus( e ) {
            var value = e.target.value;
            e.target.value = value ? localStringToNumber( value ) : ''
        }

        function onBlur( e ) {
            var value = e.target.value

            var options = {
                maximumFractionDigits: 2,
                currency: currency,
                style: "currency",
                currencyDisplay: "symbol"
            }

            e.target.value = ( value || value === 0 ) ?
                localStringToNumber( value ).toLocaleString( undefined, options ) :
                ''
        }
    }
.input_date {
    margin:1px 0px 50px 0px;
    font-family: 'Roboto', sans-serif;
    font-size: 18px;
    line-height: 1.5;
    color: #111;
    display: block;
    background: #ddd;
    height: 50px;
    border-radius: 5px;
    border: 2px solid #111111;
    padding: 0 20px 0 20px;
    width: 100px;
}
    <label for="cost_of_sale">Cost of Sale</label>
    <input class="input_date" type="currency" name="cost_of_sale" id="cost_of_sale" value="0.00">

    <label for="sales">Sales</label>
    <input class="input_date" type="currency" name="sales" id="sales" value="0.00">

     <label for="gm_pounds">GM Pounds</label>
     <input class="input_date" type="currency" name="gm_pounds" id="gm_pounds" value="0.00">


1
또한 이벤트를 여러 요소에 바인딩하는 매우 비효율적 인 방법입니다. 적절한 방법은 이제 약 10 년 동안 이벤트 위임 이었습니다.
vsync


-3

var currencyInput = document.querySelector('input[type="currency"]')
var currency = 'USD' // https://www.currency-iso.org/dam/downloads/lists/list_one.xml

 // format inital value
onBlur({target:currencyInput})

// bind event listeners
currencyInput.addEventListener('focus', onFocus)
currencyInput.addEventListener('blur', onBlur)


function localStringToNumber( s ){
  return Number(String(s).replace(/[^0-9.-]+/g,""))
}

function onFocus(e){
  var value = e.target.value;
  e.target.value = value ? localStringToNumber(value) : ''
}

function onBlur(e){
  var value = e.target.value

  var options = {
      maximumFractionDigits : 2,
      currency              : currency,
      style                 : "currency",
      currencyDisplay       : "symbol"
  }
  
  e.target.value = value 
    ? localStringToNumber(value).toLocaleString(undefined, options)
    : ''
}
input{
  padding: 10px;
  font: 20px Arial;
  width: 70%;
}
<input type='currency' value="123" placeholder='Type a number & click outside' />


또한 몇 가지 설명을 추가하십시오
Valentino Ru
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.