Skip to content

Commit bcb4c0a

Browse files
committed
_php_cast_int helper for casting values to int using PHP rules
1 parent e7996fd commit bcb4c0a

File tree

3 files changed

+141
-0
lines changed

3 files changed

+141
-0
lines changed

src/php/_helpers/_php_cast_int.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
module.exports = function _php_cast_int (value) { // eslint-disable-line camelcase
2+
// original by: Rafał Kukawski
3+
// example 1: _php_cast_int(false)
4+
// returns 1: 0
5+
// example 2: _php_cast_int(true)
6+
// returns 2: 1
7+
// example 3: _php_cast_int(0)
8+
// returns 3: 0
9+
// example 4: _php_cast_int(1)
10+
// returns 4: 1
11+
// example 5: _php_cast_int(3.14)
12+
// returns 5: 3
13+
// example 6: _php_cast_int('')
14+
// returns 6: 0
15+
// example 7: _php_cast_int('0')
16+
// returns 7: 0
17+
// example 8: _php_cast_int('abc')
18+
// returns 8: 0
19+
// example 9: _php_cast_int(null)
20+
// returns 9: 0
21+
// example 10: _php_cast_int(undefined)
22+
// returns 10: 0
23+
// example 11: _php_cast_int('123abc')
24+
// returns 11: 123
25+
// example 12: _php_cast_int('123e4')
26+
// returns 12: 123
27+
// example 13: _php_cast_int(0x200000001)
28+
// returns 13: 8589934593
29+
30+
var type = typeof value
31+
32+
switch (type) {
33+
case 'number':
34+
if (isNaN(value) || !isFinite(value)) {
35+
// from PHP 7, NaN and Infinity are casted to 0
36+
return 0
37+
}
38+
39+
return value < 0 ? Math.ceil(value) : Math.floor(value)
40+
case 'string':
41+
return parseInt(value, 10) || 0
42+
case 'boolean':
43+
// fall through
44+
default:
45+
// Behaviour for types other than float, string, boolean
46+
// is undefined and can change any time.
47+
// To not invent complex logic
48+
// that mimics PHP 7.0 behaviour
49+
// casting value->bool->number is used
50+
return +!!value
51+
}
52+
}

src/php/_helpers/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
module.exports['_bc'] = require('./_bc')
22
module.exports['_phpCastString'] = require('./_phpCastString')
3+
module.exports['_php_cast_int'] = require('./_php_cast_int')
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
// warning: This file is auto generated by `npm run build:tests`
2+
// Do not edit by hand!
3+
process.env.TZ = 'UTC'
4+
var expect = require('chai').expect
5+
var ini_set = require('../../../../src/php/info/ini_set') // eslint-disable-line no-unused-vars,camelcase
6+
var ini_get = require('../../../../src/php/info/ini_get') // eslint-disable-line no-unused-vars,camelcase
7+
var _php_cast_int = require('../../../../src/php/_helpers/_php_cast_int.js') // eslint-disable-line no-unused-vars,camelcase
8+
9+
describe('src/php/_helpers/_php_cast_int.js (tested in test/languages/php/_helpers/test-_php_cast_int.js)', function () {
10+
it('should pass example 1', function (done) {
11+
var expected = 0
12+
var result = _php_cast_int(false)
13+
expect(result).to.deep.equal(expected)
14+
done()
15+
})
16+
it('should pass example 2', function (done) {
17+
var expected = 1
18+
var result = _php_cast_int(true)
19+
expect(result).to.deep.equal(expected)
20+
done()
21+
})
22+
it('should pass example 3', function (done) {
23+
var expected = 0
24+
var result = _php_cast_int(0)
25+
expect(result).to.deep.equal(expected)
26+
done()
27+
})
28+
it('should pass example 4', function (done) {
29+
var expected = 1
30+
var result = _php_cast_int(1)
31+
expect(result).to.deep.equal(expected)
32+
done()
33+
})
34+
it('should pass example 5', function (done) {
35+
var expected = 3
36+
var result = _php_cast_int(3.14)
37+
expect(result).to.deep.equal(expected)
38+
done()
39+
})
40+
it('should pass example 6', function (done) {
41+
var expected = 0
42+
var result = _php_cast_int('')
43+
expect(result).to.deep.equal(expected)
44+
done()
45+
})
46+
it('should pass example 7', function (done) {
47+
var expected = 0
48+
var result = _php_cast_int('0')
49+
expect(result).to.deep.equal(expected)
50+
done()
51+
})
52+
it('should pass example 8', function (done) {
53+
var expected = 0
54+
var result = _php_cast_int('abc')
55+
expect(result).to.deep.equal(expected)
56+
done()
57+
})
58+
it('should pass example 9', function (done) {
59+
var expected = 0
60+
var result = _php_cast_int(null)
61+
expect(result).to.deep.equal(expected)
62+
done()
63+
})
64+
it('should pass example 10', function (done) {
65+
var expected = 0
66+
var result = _php_cast_int(undefined)
67+
expect(result).to.deep.equal(expected)
68+
done()
69+
})
70+
it('should pass example 11', function (done) {
71+
var expected = 123
72+
var result = _php_cast_int('123abc')
73+
expect(result).to.deep.equal(expected)
74+
done()
75+
})
76+
it('should pass example 12', function (done) {
77+
var expected = 123
78+
var result = _php_cast_int('123e4')
79+
expect(result).to.deep.equal(expected)
80+
done()
81+
})
82+
it('should pass example 13', function (done) {
83+
var expected = 8589934593
84+
var result = _php_cast_int(0x200000001)
85+
expect(result).to.deep.equal(expected)
86+
done()
87+
})
88+
})

0 commit comments

Comments
 (0)