2012-12-03 3 views
1

저는 Knockout MVC 내 프로젝트 (ASP.NET MVC3, 면도기)를 사용하고 있습니다. 10 진수 형식을 변경하려면 지금 찾을 수 없습니다. 소수 구분 기호로 쉼표를 사용하고 싶습니다. non-knockout Razor 도우미를 사용하여 데이터를 바인딩 할 때 올바르게 쉼표로 렌더링하지만, Knockout 바인딩을 사용하여 바인드하면 쉼표 구분 기호로 점 번호가 렌더링됩니다.넉 아웃 JS 및 소수점 구분 기호로 쉼표

쉼표를 사용하는 소수점 형식을 변경하는 방법은 무엇입니까?

+0

어쩌면이 당신을 도울 수 있습니다 희망 : http://stackoverflow.com/questions/2901102/how-to-print-number-with-thousands-separators-in-javascript – sphair

+0

@sphair,이 링크를 이용해 주셔서 감사합니다. 값이 컨트롤에 할당 된 위치를 정확히 알면 Is가 도움이됩니다. 그것은 KnockoutJS 코드의 어딘가에서 발생하지만 어디에서 (코드가 너무 복잡합니까) 모르겠습니다. –

+0

미안하지만, 당신이 Knockout MVC를 사용하고 있다는 것을 알아 채지 못했습니다. 단단한 Knockout이라고 생각했습니다. – sphair

답변

8

서버와 클라이언트 로켈의 차이점을 살펴 보았습니다.

.NET 코드는 서버 로캘과 관련된 번호 형식을 사용하지만 JS 코드는 브라우저 로캘을 기준으로 숫자 형식을 지정합니다.

브라우저에서 로캘/지역을 변경해보십시오.

편집 :

(나는 그것이 도움이되지 않았다하더라도, 다른 사람을 도움이 경우 위를 떠납니다)

문제는 서버 -의 차이에 대한 이해가입니다 측면 및 클라이언트 측면.

면도날 코드은 서버에서 실행되고 HTML로 '변환'됩니다.

반면 서버는 Javascript를 텍스트로 처리하고 보내는 HTML 문서의 일부만 처리합니다.

자바 스크립트은 클라이언트 컴퓨터 (즉, 브라우저)에서 실행됩니다.

Razor Helper가 번호를 형식 지정하는 방법은 서버에 설정된 로캘을 기반으로합니다. 반면 자바 스크립트는 브라우저에 설정된 로케일을 기반으로 숫자의 형식을 지정합니다.

function formatWithComma(x, precision, seperator) { 
    var options = { 
     precision: precision || 2, 
     seperator: seperator || ',' 
    } 
    var formatted = x.toFixed(options.precision); 
    var regex = new RegExp('^(\\d+)[^\\d](\\d{' + options.precision + '})$'); 
    formatted = formatted.replace(regex, '$1' + options.seperator + '$2'); 
    return formatted; 
} 

: 그것은 핵심의에서

에 넉 아웃/자바 스크립트에 관계없이 (클라이언트 측) 로케일의 방법을 숫자 서식을, 당신은 다음과 같은 방법을 사용하여 custom-binding을 쓸 수 있습니다 그래서 당신은 다음과 같이 보일 것입니다 바인딩 : 당신의 면도기보기에서 다음

ko.bindingHandlers.commaDecimalFormatter = { 
    init: function(element, valueAccessor) { 

     var observable = valueAccessor(); 

     var interceptor = ko.computed(function() { 
      return formatWithComma(observable()); 
     } 

     ko.applyBindingsToNode(element , { value: interceptor }); 

    } 
} 

그리고 :

,

(KnockoutMVC를 한번도 사용한 적이 없으므로이 마지막 줄은 바인딩 이름이 변경된 문서에서 바로 나온 것입니다. 테스트되지 않았습니다.

또한 ko.computed을 사용 했으므로이 바인딩은 읽기 전용입니다. <input> 요소를 사용하면 무의미합니다. <span>에서 사용하는 것이 더 좋습니다.당신이 반대 구현 바인딩 양방향 만들 수 있습니다

ko.computed({ 
    read: function() { 
     /* method as above */ 
    }, 
    write: function(newValue) { 
     /* implement reverse */ 
     observable(newValue); 
    } 
} 

EDIT 2

fiddle가 명확

+0

안녕하세요. 답변 해 주셔서 감사합니다.하지만 브라우저에서 지역/지역의 문제가 아닙니다. 올바르게 설정되었습니다. 게다가, 같은 페이지에서 나는 표준 Razor 도우미를 사용하여 동일한 속성을 바인딩하고 괜찮습니다. –

+0

제 편집을 참조하십시오. 도움이되기를 바랍니다. – Sethi

+0

안녕하세요! 첫 번째 부분은 실제로 도움이되었습니다. 감사! 하지만 불행히도 나는 전체 JavaScript 더미이고'ko.computed'에 주석을 넣는 곳에서 코드를 구현하는 법을 모르겠습니다. –

관련 문제