如何在Angular表达式中将String解析为Int?

时间:2014-01-28 06:20:32

标签: javascript angularjs

数字字符串'5'

var num_str = '5';

如何解析Int并让下面的答案同时正确?

{{num_str + 1}}  // 6
{{num_str - 1}}  // 4

parseInt不能在Angular表达式中使用,

{{parseInt(num_str) - 1}}    

数字过滤器不能做加减,

{{num_str - 1 | number}}

如果有人有有用的建议,我将非常感谢你

11 个答案:

答案 0 :(得分:85)

在您的控制器中:

$scope.num_str = parseInt(num_str, 10);  // parseInt with radix

答案 1 :(得分:77)

我更喜欢使用角度滤镜。

app.filter('num', function() {
    return function(input) {
      return parseInt(input, 10);
    };
});

然后你可以在dom中使用它:

{{'10'|num}}

这是fiddle

希望这有帮助!

答案 2 :(得分:52)

您可以尝试:

{{ 1 * num_str + 1 }}

http://jsfiddle.net/Z32fP/

答案 3 :(得分:22)

另一种选择是:

$scope.parseInt = parseInt;

然后你就可以这样做了:

{{parseInt(num_str)-1}}

这是因为角度表达式无法访问window,只能访问scope

此外,使用数字过滤器,将表达式包装在括号中:

{{(num_str-1) | number}}

DEMO

答案 4 :(得分:14)

{{ num_str - 0 }}

......对我有用。

答案 5 :(得分:9)

以上都不适合我。

但是这样做了:

{{ (num1_str * 1) + (num2_str * 1) }}

答案 6 :(得分:7)

您可以使用javascript Number方法将其解析为数字

var num=Number (num_str);

答案 7 :(得分:1)

您可以创建管道,并在系统中的任何位置使用它。

import { Pipe, PipeTransform } from '@angular/core';
 @Pipe({
     // tslint:disable-next-line:pipe-naming
     name: 'toNumber',
     pure: false }) export class ToNumberPipe implements PipeTransform { 
     public transform(items: any): any {
         if (!items) {
             return 0;
         }
         return parseInt(items, 10);
     } }

在HTML

{{ attr.text | toNumber }}

请记住在模块文件中声明此Pipe为accessfull。

答案 8 :(得分:0)

除了{{1 * num_str + 1}} 您也可以尝试这样(减去第一个):

{{ num_str - 0 + 1}}

但它非常脆弱,如果num_str包含字母,那么它将失败。因此,最好像@hassassin所说的那样尝试编写过滤器,或者在启动后立即预处理数据。

答案 9 :(得分:0)

我尝试了上面提到的解决方案,但没有一个能为我工作。我使用了JSON.parse,它起作用了:

$http.get('/api/getAdPolling')
  .success(function (data) {
    console.log('success: ' + data.length);

    if (JSON.stringify(data) != "not found") {
        $scope.adPoll = JSON.parse(data);
    }
})
  .error(function (data) {
    console.log('Error: ' + data);
});

答案 10 :(得分:0)

并不是很好,但是很有趣: 您可以-而不是+

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        mView = inflater.inflate(R.layout.fragment_scan_qr, container, false);
        qrCameraLayout = (LinearLayout) mView.findViewById(R.id.layoutScanner);
        scannerView = new ZXingScannerView(getActivity().getApplicationContext());
        scannerView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT));
        qrCameraLayout.addView(scannerView);
        return mView;
    }

    @Override
    public void onResume() {
        super.onResume();
        if (scannerView == null){
            scannerView = new ZXingScannerView(getActivity().getApplicationContext());
            qrCameraLayout.addView(scannerView);
        }
        scannerView.setResultHandler(getActivity());
        scannerView.startCamera();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        scannerView.stopCamera();
    }

    @Override
    public void onPause() {
        super.onPause();
        scannerView.stopCamera();
    }
    public void handleResult(Result result) {
        String scanResult = result.getText();
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity().getApplicationContext());
        builder.setTitle("Scan Result");
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                scannerView.resumeCameraPreview(getActivity().getApplicationContext());
            }
        });
        builder.setNegativeButton("Cancel",null);
        builder.setMessage(scanResult);
        AlertDialog alertDialog = builder.create();
        alertDialog.show();
    }

{{num_str -- 1 }}